|
我是初学,正用《Direct 3D和XNA游戏开发基础》(C#语言版)来入门,
现在刚看到第四章,在做例子的时候就遇到了疑问,烦请各位大侠指定迷津!
1.第四章的而一个例子,是用世界转换方式绘制立方体的
- device.Transform.World = Matrix.Translation(0, 0, -1);//沿Z轴向观察者方向移动1个单位
- device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);//绘制正前面
- //旋转180度是为了从外侧看,按顺时针方向绘制三角形,因背面剔除打开,内测不会看到
- device.Transform.World = Matrix.RotationY((float)Math.PI) * Matrix.Translation(0, 0, 1);
- device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2); //绘制正后面
- device.Transform.World = Matrix.RotationY(-(float)Math.PI / 2) * Matrix.Translation(1, 0, 0);
- device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2); //绘制右侧面
- device.Transform.World = Matrix.RotationY((float)Math.PI / 2) * Matrix.Translation(-1, 0, 0);
- device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2); //绘制左侧面
- [b]device.Transform.World = Matrix.RotationX((float)Math.PI / 2) * Matrix.Translation(0, 1, 0);[/b]
- device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2); //绘制下面
- [b]device.Transform.World = Matrix.RotationX(-(float)Math.PI / 2) * Matrix.Translation(0, -1, 0);[/b]
- device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2); //绘制上面
复制代码
为了能够更好的理解代码效果,我把所有代码注释之后,一段一段来执行看渲染效果
前面都没问题,到了“绘制下面(粗体显示那句)”这里,发现实际上被渲染的是立方体的上面那层,
而注释掉“绘制下面”,执行“绘制上面”时,上面那层就出不来了,这效果与书中说的好像完全相反
这里我就有疑问了,下面不该是立方体的底面吗?为什么在这里成了立方体的上方的那个面?
是书中的注释写错了吗? 但是我看了 Matrix.Translation(0, 1, 0);这句 确实又是向下移动的吧(Y轴向下为正方向)
2.也是第四章得一个例子,是说观察矩阵的。
例子是这样写的,绘制了一个墙壁和地板还有立方体,然后键盘左右键能控制立方体旋转,但是墙壁和地板不跟着转
例子是这样写:
- /* 顶点索引绘制立方体方法 */
- device.Indices = indexBuffer;
- [b]device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 0.0f, -6.0f),
- new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));[/b]//观察位置不动
- device.DrawPrimitives(PrimitiveType.TriangleList, 8, 2); //绘制地板
- device.DrawPrimitives(PrimitiveType.TriangleList, 14, 2); //绘制墙壁,下句绘制立方体
- SetupMatrices();//这个方法是用来设置世界矩阵观察矩阵和投影矩阵的,观察位置在这里将随Angles变化
- device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 8, 0, 12);
复制代码
我奇怪的是,为什么加了一句代码(粗体显示那句),墙壁就跟着不转了呢?
后面不是又调用了会变化观察矩阵的方法嘛?
我目前的理解是,那句代码先让观察位置固定,然后绘制地板和墙壁,再让观察位置可变,接着绘制立方体
那么绘制的对象就跟前面的观察位置的情况有关系了,不知道是不是这样理解?
如果这时候我再加一句观察位置不动的代码然后再绘制一个对象,是否这个对象也不会跟着动呢?(这个问题是在写这个帖子的时候想到的,所以还来不及写代码去测试)
(PS:有没有预览功能啊,我感觉我的帖子格式会乱七八糟的。。) [em11] |
|