游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4519|回复: 9

3dmax与direct3D坐标对应关系

[复制链接]

3

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2009-8-9 10:12:00 | 显示全部楼层 |阅读模式
请问3dmax与Direct3d对应的坐标关系,我的模型(用3dmax做的)加载进去后发现坐标不配对,那模型在3dmax和程序里的坐标之间到底是什么关系呢?

3

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2009-8-9 10:31:00 | 显示全部楼层

Re:3dmax与direct3D坐标对应关系

哦,俺找到了解决办法了,如下:
在用max制作完一个模型准备导出前,做如下步骤:

1) 选中整个模型

2) 完成镜像操作,选择菜单:

Tools->Mirror

在弹出对话框中对于“Mirror Axis”选择“Z”,然后按“OK”按钮

3) 导出

这样做的有两个前提:一、应选中场景中所有的物体来作镜像;二、物体应处于世界坐标系的原点。

具体原因可到该网站看:

http://www.zhouweidi.name/Tech/Article/ExportToD3D/ExportToD3D.htm

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2009-8-9 12:08:00 | 显示全部楼层

Re:3dmax与direct3D坐标对应关系

很多导出插件或格式转换工具都有Make Y-Axis Up以及左右手坐标系修正的选项,很方便

2

主题

123

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2009-8-9 13:33:00 | 显示全部楼层

Re:3dmax与direct3D坐标对应关系

准确的说,Direct3D自从8.0就不必须使用左手系了,而是同时提供了左右手系的矩阵例程。同时 XNA 和 WPF 都使用了而且只能使用右手系。所以,认为D3D是左手系是不准确的,其实微软在向右手系转移。

只不过早期D3D使用的左手系造成很多游戏和资料使用了左手系,而数学、图形学学术资料又几乎都是右手系,造成两者的脱离并导致了很多混淆。其实D3D游戏引擎完全可以用右手系,很多知名引擎也都是这么做的,如魔兽、CryEngine、Ogre等……

7

主题

13

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2009-8-10 20:47:00 | 显示全部楼层

Re:3dmax与direct3D坐标对应关系

IGame接口有转换坐标系的接口啊

3

主题

67

帖子

111

积分

注册会员

Rank: 2

积分
111
发表于 2009-8-10 21:38:00 | 显示全部楼层

Re:3dmax与direct3D坐标对应关系

YZ轴颠倒就可以了

2

主题

141

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2009-8-10 22:07:00 | 显示全部楼层

Re:3dmax与direct3D坐标对应关系

右手到左手两步:
1.  Z乘-1
2.  还要绕X旋转90度
左手到右手也完全类似,要两步的,留给你自己考虑

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2009-8-11 13:58:00 | 显示全部楼层

Re:3dmax与direct3D坐标对应关系

。。这样做会让所有的三角面都反过来,以前是顺时针的,都会变成逆时针,所以一般在渲染的时候要把默认的CULL_CW改成CULL_CCW,这样做不推荐。

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2009-8-11 14:26:00 | 显示全部楼层

Re:3dmax与direct3D坐标对应关系

通常,三维建模软件中采用的坐标系通常是右手坐标系,而direct3d中的坐标系是左手坐标系.

3

主题

67

帖子

111

积分

注册会员

Rank: 2

积分
111
发表于 2009-8-11 15:35:00 | 显示全部楼层

Re:3dmax与direct3D坐标对应关系

我用max script做过导出插件,这种方法可行:
对于顶点,YZ颠倒
对于三角面,三个顶点索引逆序,例如 1,2,5 变为 5,2,1
对于transform(骨骼,或者object的transform,在导出动画时会用到),position部分yz颠倒,scale部分yz颠倒,rotation部分,转换为angle axis,并将axis中的yz颠倒。变换后的srt分别创建出矩阵,按照scale,roation,translation的顺序重新乘,就可以得到新的transform。但如果直接给transform的position,rotation,scale成员分别赋值,你会发现你赋值了一个成员的同时,其他成员会被归0  = =
另外,对于transform,一定要在最后一步,也就是即将要写文件时再进行这种变换,如果中间结果的transform进行了变换,计算出的最后结果可能会不正确,原因我还没有弄明白,不过结果的确会不对。例如:

tCurBoneLocalTransform = tCurBoneWorldTransform * inverse( tParentBoneWorldTransform ) ;
--在这一步进行坐标系转换
tCurBoneLocalTransform = FlipCoordinateForTrans( tCurBoneLocalTransform );

在tCurBoneWorldTransform或者tParentBoneWorldTransform进行坐标系变换,则最终结果可能会不对。

另外,这个问题,真正从零开始做过max导出插件的人都碰到过,希望有更多的人把自己的经验拿出来分享。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-21 16:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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