D3D向的Vec3Project与Vec3Unproject函数的实现

来源:互联网 发布:mac 图标放到桌面 编辑:程序博客网 时间:2024/05/02 00:07

这怎么讲呢?

首先我们的数学库是D3D向的,不是不用OpenGL,而是D3D坐标系更加符合人的主观逻辑(至少我这样认为).这两个函数在D3D里和OpenGL里都有似乎OpenGL没有Unproject(我们是不用GL辅助库的,glut是什么?可以吃吗?),因为要支持两套图形,所以不能偏心用其中一个的,蛋疼啊.我的数学其实并不好,只好硬推了:

//世界空间坐标转像素空间坐标
VECTOR3 *Vec3Project(VECTOR3* pOut,const VECTOR3 *pV,const VIEWPORT *pViewport,
      const MATRIX* pProjection,
      const MATRIX* pView,
      const MATRIX* pWorld)
{

 
 MATRIX vw=(*pWorld)*(*pView)*(*pProjection);
 VECTOR4 in(pV->_x,pV->_y,pV->_z,1.0f);
 VECTOR4 out;
 Vec4Transform(&out,&in,&vw);
 VECTOR3 Temp;
 F32 HW=pViewport->_Width/2.0f;
 F32 HH=pViewport->_Height/2.0f;
 F32 DL=pViewport->_Far-pViewport->_Near;
 Temp._x=pViewport->_X+(out._x/out._w+1.0f)*HW;
 Temp._y=pViewport->_Y+(1.0f-out._y/out._w)*HH;
 Temp._z=pViewport->_Near+(out._z/out._w)*DL;
 if(pOut){
  (*pOut)=Temp;
  return pOut;
 }
 return &Temp;
}

//像素空间坐标转世界空间坐标

VECTOR3 *Vec3Unproject(VECTOR3* pOut,const VECTOR3 *pV,const VIEWPORT *pViewport,
      const MATRIX* pProjection,
      const MATRIX* pView,
      const MATRIX* pWorld)
{

 VECTOR3 temp;
 MATRIX M=(*pWorld)*(*pView)*(*pProjection);
 MATRIX IM;
 F32 D;
 MatrixInverse(&IM,&D,&M);

 F32 HW=pViewport->_Width/2.0f;
 F32 HH=pViewport->_Height/2.0f;
 F32 DL=pViewport->_Far-pViewport->_Near;

 VECTOR4 in(pV->_x,pV->_y,pV->_z,1.0f);
 //化简
 in._x=in._x-pViewport->_X;
 in._y=in._y-pViewport->_Y;
 in._z=in._z-pViewport->_Near;
 
 
 in._x=in._x/HW;
 in._x=in._x-1.0f; //x/w

 in._y=in._y/HH;
 in._y=1.0f-in._y; //y/w;

 in._z=in._z/DL;   //z/w


 VECTOR4 out;
 Vec4Transform(&out,&in,&IM);
 temp._x=out._x/out._w;
 temp._y=out._y/out._w;
 temp._z=out._z/out._w;
 if(pOut){
  (*pOut)=temp;
  return pOut;
 }
 return &temp;
}

以上就是了,希望没推错-_-0,顺便记到这个博客里.

什么推导过程?推导过程是什么东西可以吃吗?(我数学差,全靠联想能力)

原创粉丝点击