游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2984|回复: 4

三维顶点与纹理坐标的映射问题

[复制链接]

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2006-1-5 17:17:00 | 显示全部楼层 |阅读模式
〓三维顶点与纹理坐标的映射问题〓

大家新年好!

最近在研究纹理坐标系和lightmap坐标系与顶点之间的映射关系
首要问题应该是先求平面(通常是三角形所在平面)的坐标基(Axis Base)

我首先想到的是求camera坐标系类似的方法(左手系:up*normal=right,normal*right=up,通常up先取(0,+-1,0),除非normal的y分量最大,否则up取成其他,如(0,0,+-1)))。
但总感觉这个方法不太好。


在查看quake3源码的时候发现一个方法,但看了半天没太看明白:
(注:quake3是右手笛卡尔坐标系,即z垂直向上,y指向屏幕里)
//typedef float vec_t;
//typedef vec_t vec3_t[3]; //[0]即x, [1]即y, [2]即z  

// NOTE : ComputeAxisBase here and in editor code must always BE THE SAME !
// WARNING : special case behaviour of atan2(y,x) <-> atan(y/x) might not be the same everywhere when x == 0
// rotation by (0,RotY,RotZ) assigns X to normal
void ComputeAxisBase(vec3_t normal,vec3_t texX,vec3_t texY)
{
        vec_t RotY,RotZ;

        // compute the two rotations around Y and Z to rotate X to normal
        RotY = -atan2(normal[2], sqrt(normal[1]*normal[1] + normal[0]*normal[0]));
        RotZ = atan2(normal[1], normal[0]);

        // rotate (0,1,0) and (0,0,1) to compute texX and texY
        texX[0]= -sin(RotZ);
        texX[1]= cos(RotZ);
        texX[2]= 0;

        // the texY vector is along -Z ( T texture coorinates axis )
        texY[0]= -sin(RotY)*cos(RotZ);
        texY[1]= -sin(RotY)*sin(RotZ);
        texY[2]= -cos(RotY);
}


Q1:我大概看出来是通过旋转轴的方式在求,但画个图发现不对啊~~~~~



然后就是求平面的顶点坐标对应的纹理坐标:
//dv->xyz即顶点的三维坐标, s->texMat即纹理坐标变换矩阵

ComputeAxisBase( 顶点所在平面的法线, texX, texY );
x = DotProduct( dv->xyz, texX );
y = DotProduct( dv->xyz, texY );
dv->st[0] = s->texMat[0][0]*x + s->texMat[0][1]*y + s->texMat[0][2]; //即纹理的u或s值
dv->st[1] = s->texMat[1][0]*x + s->texMat[1][1]*y + s->texMat[1][2]; //即纹理的v或t值


Q2:这里的点积DotProduct是做什么的?为什么这样做就把三维顶点变换到平面坐标轴上了呢?


Q3: 请问还有其他方法求吗?

您的任何建议和想法对我都有用。
多谢了!

1

主题

50

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2006-1-6 16:14:00 | 显示全部楼层

Re:三维顶点与纹理坐标的映射问题

DotProduct的作用是求3D坐标在坐标轴上面的投影。
建议参考《3D游戏与计算机图形学中的数学方法》一书。

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2006-1-7 16:01:00 | 显示全部楼层

Re:三维顶点与纹理坐标的映射问题

多谢楼上提醒!

请问求坐标基的方法您看懂了么?还有没有其他方法呢?

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-1-7 23:02:00 | 显示全部楼层

Re:三维顶点与纹理坐标的映射问题

你已经理解了任取一个辅助向量up',然后通过叉乘找到right,再叉乘出up。
而quake3里的这个做法实质上就是要设法先在xy平面里找到一个基,然后找到另一个基。
quake3里的做法是先求出normal的高度角RotY和方位角RotZ。
已知方位角,获得一个在xy平面上的与normal垂直的向量就很简单了。只要用方位角做一个单位向量绕 z 轴旋转 pi/2就可以了。
现在求另一个基,方法是已知这个基的方位角等于RotZ,高度角等于RotY - pi/2,然后用球面坐标转直角坐标的公式即可。
不过我觉得这个方法还不太好,因为需要求很多三角函数,计算一定很花时间。最好的办法应该是以 z 轴作为辅助向量,与normal叉乘得出一个基,再用这个基叉乘normal得到另一个基。

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2006-1-8 10:55:00 | 显示全部楼层

Re:三维顶点与纹理坐标的映射问题

多谢楼上
问题解决了,原来是这么回事。寒自己一个...

其实我觉得可以先用q3的方法求出right,然后再叉乘得到up
因为在选辅助轴的时候(世界坐标的up)要考虑一些特殊情况,就好像在用lookat方法设置camera矩阵时一样。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 04:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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