Geometry 重叠和对齐三维三角形时出现问题
我正试图叠加两个3D三角形来解决一个分子建模问题。这似乎很简单。我将每个三角形的第一个点转换为原点0,0,0。然后我计算了我必须绕z轴旋转的角度,以便将第二个点放在x轴上。使用Rz(θ)的x,y,z公式,这将是Geometry 重叠和对齐三维三角形时出现问题,geometry,Geometry,我正试图叠加两个3D三角形来解决一个分子建模问题。这似乎很简单。我将每个三角形的第一个点转换为原点0,0,0。然后我计算了我必须绕z轴旋转的角度,以便将第二个点放在x轴上。使用Rz(θ)的x,y,z公式,这将是y=0时的角度, y=xsin(θ)+ycos(θ)=0,并重新排列,tan(θ)=-y/x 角度应为arctan(-y/x)。但是,将该角度值插回上述原始方程中不会得到零,除非x=y,且切线为一。看起来像是简单的代数-为什么这不起作用? 谢谢您的帮助。其他评论表明,您很可能对投影和测角术
y=0时的角度,
y=xsin(θ)+ycos(θ)=0
,并重新排列,tan(θ)=-y/x
角度应为arctan(-y/x)
。但是,将该角度值插回上述原始方程中不会得到零,除非x=y
,且切线为一。看起来像是简单的代数-为什么这不起作用?
谢谢您的帮助。其他评论表明,您很可能对投影和测角术感到困惑。还有一种更安全的方法,不使用向量数学(线性代数)进行测角
创建变换矩阵m0
表示与第一个三角形对齐的平面t0
所谓对齐,我的意思是三角形的一条边应该位于一个平面基向量中。这很简单,您只需将一个基向量设置为有问题的边,将原点设置为它的一个点,然后利用叉积来获得重新标记向量
因此,如果我们的三角形有点p0,p1,p2
,我们的基向量是x,y,z
,原点o
,那么:
x = p1-p0; x /= |x|;
y = p2-p0;
z = cross(x,y); z /= |z|;
y = cross(z,x); y /= |y|;
o = p0
因此,只需将它们输入到变换矩阵(参见答案底部的链接)
创建变换矩阵m1
表示与第二个三角形对齐的平面t1
它与#1
计算最终变换矩阵m
将t1
转换为t0
这很简单:
m = Inverse(m1)*m0
现在,只要将m
矩阵乘以该点,就可以将t1
中的任何点对齐到t0
。不要忘记使用同伦坐标,以便点(x,y,z,1)
这里是小型C++/OpenGL示例:
//---------------------------------------------------------------------------
双t0[3][3]=//第一个三角形
{
-0.5,-0.5,-1.2,
+0.5,-0.5,-0.8,
0.0,+0.5,-1.0,
};
双t1[3][3]=//第二个三角形
{
+0.5,-0.6,-2.1,
+1.5,-0.5,-2.3,
+1.2,+0.3,-2.2,
};
双arot=0.0;//动画角度
//---------------------------------------------------------------------------
void gl_draw()//主渲染代码
{
int i;
双m0[16],m1[16],m[16],x[3],y[3],z[3],t2[3][3];
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glDisable(GLU消隐面);
glEnable(GLU深度试验);
glMatrixMode(GLU模型视图);
glLoadIdentity();
GLP(0.0,0.0,-10.0);
glRotatef(arot,0.0,1.0,0.0);
//渲染原始三角形
glBegin(GL_三角形);
glColor3f(1.0,0.0,0.0);for(i=0;i,正如其他评论所暗示的那样,你很可能会被投影和测角术弄糊涂。使用向量数学(线性代数)没有测角术也有更安全的方法
创建变换矩阵m0
表示与第一个三角形对齐的平面t0
所谓对齐,我的意思是三角形的一条边应该位于一个平面基向量中。这很简单,你只需将一条基向量设置为有问题的边,原点作为它的一个点,然后利用叉积得到重新标记向量
因此,如果我们的三角形有点p0,p1,p2
,我们的基向量是x,y,z
,原点o
,那么:
x = p1-p0; x /= |x|;
y = p2-p0;
z = cross(x,y); z /= |z|;
y = cross(z,x); y /= |y|;
o = p0
因此,只需将它们输入到变换矩阵(参见答案底部的链接)
创建变换矩阵m1
表示与第二个三角形对齐的平面t1
它与#1
计算最终变换矩阵m
将t1
转换为t0
这很简单:
m = Inverse(m1)*m0
现在,只要将m
矩阵乘以该点,即可将t1
中的任何点对齐到t0
。不要忘记使用同伦坐标,因此点(x,y,z,1)
这里是小型C++/OpenGL示例:
//---------------------------------------------------------------------------
双t0[3][3]=//第一个三角形
{
-0.5,-0.5,-1.2,
+0.5,-0.5,-0.8,
0.0,+0.5,-1.0,
};
双t1[3][3]=//第二个三角形
{
+0.5,-0.6,-2.1,
+1.5,-0.5,-2.3,
+1.2,+0.3,-2.2,
};
双arot=0.0;//动画角度
//---------------------------------------------------------------------------
void gl_draw()//主渲染代码
{
int i;
双m0[16],m1[16],m[16],x[3],y[3],z[3],t2[3][3];
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glDisable(GLU消隐面);
glEnable(GLU深度试验);
glMatrixMode(GLU模型视图);
glLoadIdentity();
GLP(0.0,0.0,-10.0);
glRotatef(arot,0.0,1.0,0.0);
//渲染原始三角形
glBegin(GL_三角形);
glColor3f(1.0,0.0,0.0);for(i=0;i当你围绕一个轴旋转一个3D点(比如z轴)时,它沿着一个圆周。这个圆周可能会碰到一个轴(比如x轴),但通常不会。我想你是在做投影而不是交点tan(x)
具有90度的奇数倍的渐近线,因此它不能很好地处理这些边缘情况。如果您的语言支持,您应该使用atan2(y,x)
。这仅通过使用+
,-
,*
交叉和点积(偶数)的基本向量/矩阵数学就可以做到不需要测角仪,因为它会降低结果的准确性。无论如何,我投票结束这个问题,因为它是离题的