zoukankan      html  css  js  c++  java
  • DirectX10一向量代数(一)

    一.向量(vector)

            向量(vector)是一种同时具有方向和大小的物理量,而在DirectX10中,我们主要把精力放在D3DX向量上,D3DXVECTOR3类主要用于在代码中存储相对于某个坐标系的点和向量的坐标,这其中有很多非常有用的向量处理函数:

        

       FLOAT   D3DXVec3Length(  //return || v ||
       CONST D3DXVECTOR3 *pV);
       FLOAT   D3DXVec3Length3q(  //return || v || * || v ||
       CONST D3DXVECTOR3 *pV);
       FLOAT   D3DXVec3Dot(  //return v1 . v2
       CONST D3DXVECTOR3 *pV1,
       CONST D3DXVECTOR3 *pV2,
       );
       D3DXVECTOR3  D3DXVec3Cross(  //return  v1 x v2
       CONST D3DXVECTOR3 *pV1,
       CONST D3DXVECTOR3 *pV2,
       }
       D3DXVECTOR3  *WINAPI  D3DXVec3Normalize( 
       D3DXVECTOR3 *pOut,      //return  v / ||v||
       CONST D3DXVECTOR3  *pV
       );

        当需要使用D3DX的程序都必须链接到d3dx10.lib库文件(当使用调试模式进行编译时,应链接到d3d10d.lib

    我们可以来试一试这几个函数:

    #include <iostream>
    //#include <D3DX10.h>
    #include <D3DX10math.h>
    
    using namespace std;
    
    
    ostream&  operator<<(ostream& os,D3DXVECTOR3& v)
    {
    
    	os<<"{"<<v.x<<","<<v.y<<","<<v.z<<"}";
    	return os;
    }
    
    
    
    int main()
    {
    
    	D3DXVECTOR3 u(1.0f,2.0f,3.0f);
    
    
    	float  x[3] = {-2.0f,1.0,-3.0f};
    
    	D3DXVECTOR3 v(x);
    
    
    	D3DXVECTOR3  a,b,c,d,e;
    
    
    	a = u+v;
    
    	b = u-v;
    
    	c = u*10;
    
    	float  length = D3DXVec3Length(&u);
    
    	D3DXVec3Normalize(&d,&u);
    
    	float  s = D3DXVec3Dot(&u,&v);
    
    	D3DXVec3Cross(&e,&u,&v);
    
    	//////////////////////////////////////////
    
    	cout<<" u = "<<u<<endl;
    
    	cout<<" v = "<<v<<endl;
    
    	cout<<"a = u + v   ="<<a<<endl;
    
    	cout<<"b = u - v   ="<<b<<endl;
    
    	cout<<"c = u * 10  ="<<c<<endl;
    
    	cout<<"d = u / ||u||   = "<<d<<endl;
    
    	cout<<"e = u x v   ="<<e<<endl;
    
    	cout<<"length = ||u|| = "<<length<<endl;
    	
    	cout<<"s = u.v = "<<s<<endl;
    
    
    
    	system("pause");
    
    	return 0;
    }
    结果如下:

    有几个地方我们需要注意:

        1,我们需要使用到的D3DXVECTOR3以及各操作函数是在头文件D3DX10math.h中定义的,因此需要包含该头文件

        2.在配置链接库的时候最好是添加上库的debug库,一般是结尾多加个d,比如d3dx10.libd3dx10d.lib

        3.不建议使用using namespace  std;这种形式,当需要使用不同域的变量或函数时容易造成干扰,产生错误,建议直接使用(域::变量),本文程序简单,为简化起见,故才这样做。

        4.重载操作符的时候一定要注意参数形式、

       5.当出现error LNK2019: 无法解析的外部符号_D3DXVec3Normalize@8,该符号在函数_main中被引用这种错误的时候,注意看看你的链接库,是不是链接到X64lib去了,改回X86的库就好了,不要因为你是64位机器就链接到X64的库,因为你创建的是Win32项目,所以只能链接到X86的库。关于这一点,后面有时间在深入探究。




  • 相关阅读:
    手撕面试官系列(十一):BAT面试必备之常问85题
    手撕面试官系列(十):面试必备之常问Dubbo29题+MySQL55题
    手撕面试官系列(九):分布式限流面试专题 Nginx+zookeeper
    手撕面试官系列(八):分布式通讯ActiveMQ+RabbitMQ+Kafka面试专题
    手撕面试官系列(七):面试必备之常问并发编程高级面试专题
    手撕面试官系列(六):并发+Netty+JVM+Linux面试专题
    手撕面试官系列(五):Tomcat+Mysql+设计模式面试专题
    手撕面试官系列(四 ):MongoDB+Redis 面试专题
    手撕面试官系列(三):微服务架构Dubbo+Spring Boot+Spring Cloud
    linux 使用socket代理
  • 原文地址:https://www.cnblogs.com/ainima/p/6331132.html
Copyright © 2011-2022 走看看