游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3052|回复: 5

d3d坐标旋转的疑问

[复制链接]

36

主题

135

帖子

135

积分

注册会员

Rank: 2

积分
135
发表于 2004-3-7 17:47:00 | 显示全部楼层 |阅读模式
VOID SetupMatrices()
{
    // For our world matrix, we will just rotate the object about the y-axis.
    D3DXMATRIX matWorld;
    D3DXMatrixRotationY( &matWorld, timeGetTime()/150.0f );
    g_pd3dDevice->SetTransform( D3DTS_WORLD , &matWorld );

    // Set up our view matrix. A view matrix can be defined given an eye point,
    // a point to lookat, and a direction for which way is up. Here, we set the
    // eye five units back along the z-axis and up three units, look at the
    // origin, and define "up" to be in the y-direction.
    D3DXMATRIX matView;
    D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f, -8.0f ),
                                  &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
                                  &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

    // For the projection matrix, we set up a perspective transform (which
    // transforms geometry from 3D view space to 2D viewport space, with
    // a perspective divide making objects smaller in the distance). To build
    // a perpsective transform, we need the field of view (1/4 pi is common),
    // the aspect ratio, and the near and far clipping planes (which define at
    // what distances geometry should be no longer be rendered).
    D3DXMATRIX matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}

这是在MS DX8 SDK的Tutorials/Tut03_Matrices里面的一个函数,功能是调整世界坐标、观察坐标和投影坐标,从而让一个三角形绕y轴旋转起

来。考虑其中的世界坐标变换代码:
D3DXMATRIX matWorld;
D3DXMatrixRotationY( &matWorld, timeGetTime()/150.0f );
g_pd3dDevice->SetTransform( D3DTS_WORLD , &matWorld );

每次进入这个函数的时候,matWorld都会被初始化,D3DXMatrixRotationY都会把一个全部是0的矩阵进行变换,而不是针对已经定义好的全局

顶点数组的指针(LPDIRECT3DVERTEXBUFFER8 g_pVB)进行操作,我就奇怪执行g_pd3dDevice->SetTransform( D3DTS_WORLD , &matWorld );怎

么会转动整个世界坐标?没有信息的输入啊!
只有一个解释:在调用SetTransform的时候实际上是将变换矩阵matWorld和现在整个世界坐标进行操作,因此不用显式的给出当前的世界坐标

信息,不过问题在于timeGetTime()的值越来越大,因此将这个空白矩阵matWorld转动的角度也越大,如果按照我的解释的话,当matWorld作用

在世界坐标上,也会使得世界坐标转动越转越快,但实际上是匀速转动的,为什么?

为什么每次D3DXMatrixRotationY操作一个没有任何信息输入的矩阵,却可以使得整个世界转动?

36

主题

135

帖子

135

积分

注册会员

Rank: 2

积分
135
 楼主| 发表于 2004-3-7 21:39:00 | 显示全部楼层

Re:d3d坐标旋转的疑问

大虾救命啊!

35

主题

105

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2004-3-7 21:48:00 | 显示全部楼层

哥们~~

D3DXMatrixRotationY 已经帮你构造了一个延y轴旋转的“空白”矩阵!
timeGetTime()/x;就是旋转的角速度

错了~不是角速度~~是角位移,这个  角位移=角速度 * 时间,所以你看起来总是一个
变量~你用了这个角位移构造了一个可以延y周旋转的矩阵~~嗯!一切都在你的控制中!

36

主题

135

帖子

135

积分

注册会员

Rank: 2

积分
135
 楼主| 发表于 2004-3-7 22:00:00 | 显示全部楼层

Re:d3d坐标旋转的疑问

你是说那是一个角位移吗?那样的话,是不是说所有的这种坐标变换函数都是给出这样一个变换矩阵,dx会将它作用在整个世界坐标上?

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2004-3-7 22:08:00 | 显示全部楼层

Re:d3d坐标旋转的疑问

你没有理解几何流水线的过程。
SetTransform本身不进行任何实际变换操作,它只是告诉几何流水线接下来要输出的顶点是用哪些矩阵进行哪些变换而已。
也就是说过程是这样的
SetTransform->SetStreamsource->DrawPrimitive->SetTransform->SetStreamsource->DrawPrimitive……
直到所有你想输出的几何体输出完毕为止。每次都是以一个‘SetTransform->SetStreamsource->DrawPrimitive’为循环。
而对于保存在显存或者内存(视vertexbuffer建立方式而定)的顶点,只要你不去手工改变(lock后改变)的话,这些数据是永远不变的,(也就是几何流水线并不改变显存中的数据,而只是把该数据提出来变换后直接输出到像素处理单元中,并不把变换结果写回显存)所以D3DXMatrixRotationY建立的矩阵所实现的转动角度当然是越来越大咯,只要导数相同就是匀速旋转。

嗯,忘了一条重要的,在SetStreamsource后还需要SetVertexShader,不过对于FFP(Fixed Function Pipeline)来说,SetVertexShader使用你定义的顶点格式作为参数就可以了。它是告诉几何流水线针对顶点中不同的数据(如position或normal)在变换中如何操作(就如我们所知的,同样是World transform,normal和position的变换就不同)
还有一些Setrenderstate,就根据具体需要具体设置吧。

35

主题

105

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2004-3-7 22:13:00 | 显示全部楼层

Re:d3d坐标旋转的疑问

嗯`~根据需要构造自己的旋转矩阵,如:D3DXMatrixRotationAxis,等等`
dx这么做得好处是~~你用不着记住旋转矩阵到底长什么样

如果你调用D3DXMatrixRotationY(&wd,  theta);
就相当于自己构造了这样一个矩阵
| cos(theta)  ,0 , -sin(theta) ,0 |
|        0         ,1 ,         0        ,0 |              
| sin(theta)   ,0,   cos(theta),0 |
|        0          ,0,         0        ,1 |

这个矩阵表示把一个图形从原来的位置,如何变换到运动后的位置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-25 16:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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