您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页unity3D技术之研究院之通过坐标变换实现简单太阳系

unity3D技术之研究院之通过坐标变换实现简单太阳系

来源:筏尚旅游网



我们拿太阳系为模型,主要实现太阳自转、地球自转、地球公转、月球自转、月球公转效果。由于现

在还没有说到模型的绘制,我们现在暂时用正方体来代表三个星球。

先来看一下,在Direct3D中是如何生成平移、旋转、缩放矩阵的。()

1、生成平移矩阵:

1 D3DXMATRIX* WINAPI D3DXMatrixTranslation

2 ( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z );

pOUt是最终生成的平移矩阵指针,xyz分别表示各方向上的移动量。

2、生成旋转矩阵:


转的角度。
这三个函数分别生成绕xyz 轴旋转的旋转矩阵。其中pOut 是生成的旋转矩阵指针,Angle 为旋

pOut为生成的缩放矩阵指针,sxsysz分别为在三个坐标轴上的缩放系数。同设置不同的缩放系

数可以实现一些特殊效果。

将要实现的简单太阳系就是通过这一系列的有序组合实现的。我们分别为太阳、地球、月球进行设置。

设置太阳:






10 g_pDevice->SetTransform(D3DTS_WORLD, &matWorld);
11
12 //观察变换
13 D3DXVECTOR3 eyePos(0.0f, 10.0f, -20.0f);
14
D3DXVECTOR3 lookatPos(0.0f, 0.0f, 1.0f); 15 D3DXVECTOR3 updir(0.0f, 1.0f, 0.0f);
16
17 D3DXMATRIX matView;
18 D3DXMatrixLookAtLH(&matView, &eyePos, &lookatPos, &updir);
19 g_pDevice->SetTransform(D3DTS_VIEW, &matView);
20
21 //投影变换
22 D3DXMATRIX matProj;
23
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f); 24 g_pDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}

在此方法中首先进行了世界变换,也就是我们的太阳自转操作,然后是观察、投影的变换。在声明一

个矩阵后,调用函数D3DXMatrixIdentity在将矩阵转换为单位矩阵(矩阵左上角到右下角这条对角线上

的值为1,其他值为0 的矩阵)以防止意外操作产生的不利影响。在世界变换中实现太阳的自转此处设置y
置、眼睛摆放向上方向。
轴为太阳中心轴,角速度由系统时间得出。设置观察变换,主要需要三个向量:眼睛的位置、所观察的位

此方法生成观察变换矩阵(此处为左手坐标系),pOut 为生成的观察矩阵指针,pEye 为眼睛的摆放

位置指针,pAt为观察的点的指针,pUp为眼睛摆放的向上方向指针。

1 D3DXMATRIX* WINAPI D3DXMatrixPerspectiveFovLH

2 ( D3DXMATRIX *pOut, FLOAT fovy, FLOAT Aspect, FLOAT zn, FLOAT zf );

此方法生成投影变换矩阵(此处为左手坐标系),pOut为生成的投影变换矩阵指针,fovy为在y

方向看到的最大范围(弧度),Aspect为视区宽度与高度的比例,zn为近裁剪面的z值,zf为远裁剪面

z值,这样就形成一个近小远大的台体,我们所看到的一切就都在这个台体中。

设置地球:


1

void SetEarthMatrix()

2

{

3

D3DXMATRIXA16 matWorld;

4

D3DXMATRIX matTran;

5

D3DXMATRIX matRot0;

6

D3DXMATRIX matRot1;





设置月球:





22 D3DXMatrixRotationY(&matRot0, 2*D3DX_PI*(timeGetTime()%1000)/1000); 23 //相对地球,平移到绕地球轨道
24 D3DXMatrixTranslation(&matTran0,2,0,0);
25 //绕地球公转
26 D3DXMatrixRotationY(&matRot1,2*D3DX_PI*(timeGetTime()%1000)/1000); 27 //相对太阳平移
28 D3DXMatrixTranslation(&matTran1,5,0,0);
29 //绕太阳公转
30 D3DXMatrixRotationY(&matRot2,2*D3DX_PI*(timeGetTime()%10000)/10000); 31
32 matWorld = matScal * matRot0 * matTran0 * matRot1 * matTran1 * matRot2; 33
34 g_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
35 }

对地球和月球的设置,主要注意各种矩阵变换的顺序,在这里,矩阵变换的组合操作由矩阵相乘得到,

操作的顺序由左向右,需要清楚的一点事,矩阵相乘不支持交换律。当然也可以使用函数

D3DXMatrixMultiply数做乘法运算,原型如下:


pOut 为得到的矩阵指针,pM1pM2 为待处理矩阵,两者按顺序相乘(本人比较喜欢使用a*b

视区变换通过函数SetViewport 实现,它只有一个参数,就是一个D3DVIEWPORT9 结构体的指针,D3DVIEWPORT9 中的属性含义:X 为视区左上角x 坐标,Y 为视区左上角y 坐标,Width 为视区的
宽度,Height 为视区的高度,MinZ 为视区内物体的最小深度值,MaxZ 为视区内物体的最大深度值。




在绘制图形的时候,要先执行变换操作,再进行绘制。

运行程序,我们将看到如图效果:

本文仅供参考,如有不足,还望赐教,大家共同学习进步。好,到这里,简单的太阳系就做好了。




因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务