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,顺便记到这个博客里.
什么推导过程?推导过程是什么东西可以吃吗?(我数学差,全靠联想能力)
- D3D向的Vec3Project与Vec3Unproject函数的实现
- D3D的绘制函数总结
- 如何实现D3D全屏与窗口的转换
- 如何实现D3D全屏与窗口的转换
- d3d与OpenGL的博弈
- DirectX的安装与D3D的初始化
- d3d中实现简单的水
- d3d实现一个旋转的三菱椎
- d3d实现一个旋转的三角形
- D3D中光照的基本实现
- <D3D> 二维火焰实现的算法
- D3D中镜子效果的实现
- 【D3DX日记】D3D与D3DX的区别
- Excel如何实现与VLOOKUP函数相反的左向查找公式
- 【D3D】一个D3D程序的基本结构
- 诸仙D3D游戏环境下如何实现真正D3D的窗口
- d3d的学习
- D3D中多流的用法
- 多表查询(二)-----表的连接类型
- Linux C 函数参考(环境变量,终端控制)[转]
- WordPress 优化方法大全
- Linux C 函数参考(接口处理)[转]
- 垂直上TCP/IP结构
- D3D向的Vec3Project与Vec3Unproject函数的实现
- 自定义数组传递
- poj3006
- 广播分组转发
- OMNET++的使用(1)
- 怎么能够的分
- Enigma Protector V1.1X-V1.3X -> Sukhov Vladimir & Serge N. Markin *破解注册限制
- 在OpenGL场景中实现小地图功能(www.c3dn.net)
- 第一本书《瓦尔登湖》