编辑
我不知道这是否重要,但目标三角形的角度可能与源三角形不同。这个事实是否使变换非仿射?(我不确定)
我有两个在三维空间中的三角形。已知第一个三角形中某点的坐标(x,y,z)和向量V1,V2,V3。我需要找到点(x',y',z')。使用向量V1,V2,V3对点(x,y,z)进行什么转换才能得到第二个三角形中的变换点呢?
感谢您的帮助!!!
编辑
我不知道这是否重要,但目标三角形的角度可能与源三角形不同。这个事实是否使变换非仿射?(我不确定)
我有两个在三维空间中的三角形。已知第一个三角形中某点的坐标(x,y,z)和向量V1,V2,V3。我需要找到点(x',y',z')。使用向量V1,V2,V3对点(x,y,z)进行什么转换才能得到第二个三角形中的变换点呢?
感谢您的帮助!!!
u = <u0, u1, u2, 1> u' = <u0', u1', u2', 1> v = <v0, v1, v2, 1> v' = <v0', v1', v2', 1> w = <w0, w1, w2, 1> w' = <w0', w1', w2', 1>
通常情况下,您的问题可以通过识别形式为以下线性变换来解决:
|a0,0 a0,1 a0,2 a0,3| A = |a1,0 a1,1 a1,2 a1,3| |a2,0 a2,1 a2,2 a2,3| |0 0 0 1 |这个公式是必需的,因为该变换似乎是3D仿射变换,而不是3D线性变换。如果它是线性变换,则包含原点的任何三角形必然映射到另一个包含原点的三角形。将其扩展到4D空间允许使用4D线性变换执行3D仿射变换。这里有一个矩阵 A:
Au = u' Av = v' Aw = w'满足以下条件:
a · p + d = p'
b · p + e = p'
c · p + f = p'
|u - p| |u' - p'| ------- = --------- |u - a| |u' - Aa| |v - p| |v' - p'| ------- = --------- |v - b| |v' - Ab| |w - p| |w' - p'| ------- = --------- |w - c| |w' - Ac|这是一个涉及到编程的公式,描述了三个向量之间的关系。
y
和y'
)来完成:其中×
是两个向量的3-D叉积(即省略每个向量中的最后一个1;但记得一旦计算出y和y',就将1附加到它们上)。 从那里开始,您可以应用从列向量创建矩阵M和M'的标准技术:并使用Steve Emmerson建议的方法(在4-D而不是3-D中):请查看andand的评论以了解理论。
// Qt 代码
QMatrix4x4 m;
QMatrix4x4 t1;
QMatrix4x4 t2;
QVector3D v1(0,0,0);
QVector3D v2(0,1,0);
QVector3D v3(1,0,0);
QVector3D v4 = v1 + QVector3D::crossProduct(v2-v1, v3-v1);
QVector3D v1p(0,0,2);
QVector3D v2p(0,3,2);
QVector3D v3p(1,0,1);
QVector3D v4p = v1p + QVector3D::crossProduct(v2p-v1p, v3p-v1p);
t1.setColumn(0, QVector4D(v1, 1));
t1.setColumn(1, QVector4D(v2, 1));
t1.setColumn(2, QVector4D(v3, 1));
t1.setColumn(3, QVector4D(v4, 1));
t2.setColumn(0, QVector4D(v1p, 1));
t2.setColumn(1, QVector4D(v2p, 1));
t2.setColumn(2, QVector4D(v3p, 1));
t2.setColumn(3, QVector4D(v4p, 1));
m = t2 * t1.inverted();
for(float i=0.0; i<2.5; i+=0.05)
{
QVector4D p(0.2+i,i,0,1);
QVector4D pp( m * p );
glBegin(GL_LINE_STRIP);
glColor4f(1,1,1,1);
glVertex3d(p.x(), p.y(), p.z());
glColor4f(1,0,1,1);
glVertex3d(pp.x(), pp.y(), pp.z());
glEnd();
}
以下是此代码的演示视频: http://www.youtube.com/watch?v=yOU90pBoyZY
只需将向量添加到每个点即可。 点 + 向量 == 新点。 这基本上是创建向量的相反过程:V1 ==(x1'-x1,y1'-y1,z1'-z1),因此(x1',y1',z1')==(x1 + V1x,y1 + v1y,z1 + V1z)。
让
x = αx1 + βx2 + γx3
那么 x' = αx1' + βx2' + γx3' 因此
x' = α(x1+V1) + β(x2+V2) + γ(x3+V3)