游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3388|回复: 1

关于学习《Direct 3D和XNA游戏开发基础》疑问。。

[复制链接]

1

主题

7

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2011-6-23 21:53:00 | 显示全部楼层 |阅读模式
我是初学,正用《Direct 3D和XNA游戏开发基础》(C#语言版)来入门,
现在刚看到第四章,在做例子的时候就遇到了疑问,烦请各位大侠指定迷津!

1.第四章的而一个例子,是用世界转换方式绘制立方体的

  1. device.Transform.World = Matrix.Translation(0, 0, -1);//沿Z轴向观察者方向移动1个单位
  2. device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);//绘制正前面

  3. //旋转180度是为了从外侧看,按顺时针方向绘制三角形,因背面剔除打开,内测不会看到
  4. device.Transform.World = Matrix.RotationY((float)Math.PI) * Matrix.Translation(0, 0, 1);
  5. device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2); //绘制正后面

  6. device.Transform.World = Matrix.RotationY(-(float)Math.PI / 2) * Matrix.Translation(1, 0, 0);
  7. device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2); //绘制右侧面

  8. device.Transform.World = Matrix.RotationY((float)Math.PI / 2) * Matrix.Translation(-1, 0, 0);
  9. device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2); //绘制左侧面

  10. [b]device.Transform.World = Matrix.RotationX((float)Math.PI / 2) * Matrix.Translation(0, 1, 0);[/b]
  11. device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2); //绘制下面

  12. [b]device.Transform.World = Matrix.RotationX(-(float)Math.PI / 2) * Matrix.Translation(0, -1, 0);[/b]
  13. device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2); //绘制上面
复制代码


为了能够更好的理解代码效果,我把所有代码注释之后,一段一段来执行看渲染效果
前面都没问题,到了“绘制下面(粗体显示那句)”这里,发现实际上被渲染的是立方体的上面那层,
而注释掉“绘制下面”,执行“绘制上面”时,上面那层就出不来了,这效果与书中说的好像完全相反
这里我就有疑问了,下面不该是立方体的底面吗?为什么在这里成了立方体的上方的那个面?
是书中的注释写错了吗? 但是我看了 Matrix.Translation(0, 1, 0);这句 确实又是向下移动的吧(Y轴向下为正方向)


2.也是第四章得一个例子,是说观察矩阵的。
例子是这样写的,绘制了一个墙壁和地板还有立方体,然后键盘左右键能控制立方体旋转,但是墙壁和地板不跟着转

例子是这样写:

  1. /* 顶点索引绘制立方体方法 */

  2. device.Indices = indexBuffer;
  3. [b]device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 0.0f, -6.0f),
  4.              new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));[/b]//观察位置不动
  5. device.DrawPrimitives(PrimitiveType.TriangleList, 8, 2); //绘制地板
  6. device.DrawPrimitives(PrimitiveType.TriangleList, 14, 2); //绘制墙壁,下句绘制立方体

  7. SetupMatrices();//这个方法是用来设置世界矩阵观察矩阵和投影矩阵的,观察位置在这里将随Angles变化
  8. device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 8, 0, 12);

复制代码


我奇怪的是,为什么加了一句代码(粗体显示那句),墙壁就跟着不转了呢?
后面不是又调用了会变化观察矩阵的方法嘛?
我目前的理解是,那句代码先让观察位置固定,然后绘制地板和墙壁,再让观察位置可变,接着绘制立方体
那么绘制的对象就跟前面的观察位置的情况有关系了,不知道是不是这样理解?
如果这时候我再加一句观察位置不动的代码然后再绘制一个对象,是否这个对象也不会跟着动呢?(这个问题是在写这个帖子的时候想到的,所以还来不及写代码去测试)

(PS:有没有预览功能啊,我感觉我的帖子格式会乱七八糟的。。) [em11]

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-9-22 23:07:00 | 显示全部楼层

Re: 关于学习《Direct 3D和XNA游戏开发基础》疑问。。

楼主打扰下,我是初学C#+DirectX,希望楼主把你看的教程发给我下
我在网上一直找不到这方面的学习手册,感激不尽
QQ:563101441
Email: ly563101441@qq.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-3 18:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表