如何将3D tringle平放在墙上旋转?

如何将3D tringle平放在墙上旋转?,3d,rotation,geometry,3d,Rotation,Geometry,我正在处理3D网格数据,我有很多3D三角形需要旋转以消除Z值,并将其转换为2D三角形 用这个二维三角形,我在做一些向量计算 完成工作后,我需要将其旋转回原始角度,以便旧点返回其原始位置,以适应三维网格 编辑:这是我正在使用的代码。 我想不出如何反转旋转 投入 var p1:Object, p2:Object, p3:Object; 找脸正常吗 var norm:Object = calcNormal(p1,p2,p3); 基于法线查找旋转角度 sinteta = -norm.y / Mat

我正在处理3D网格数据,我有很多3D三角形需要旋转以消除Z值,并将其转换为2D三角形

用这个二维三角形,我在做一些向量计算

完成工作后,我需要将其旋转回原始角度,以便旧点返回其原始位置,以适应三维网格


编辑:这是我正在使用的代码。
我想不出如何反转旋转

投入

var p1:Object, p2:Object, p3:Object;
找脸正常吗

var norm:Object = calcNormal(p1,p2,p3);
基于法线查找旋转角度

sinteta = -norm.y / Math.sqrt(norm.x * norm.x + norm.y * norm.y);
costeta = norm.x / Math.sqrt(norm.x * norm.x + norm.y * norm.y);
sinfi = -Math.sqrt(norm.x * norm.x + norm.y * norm.y);
cosfi = norm.z;
围绕Z旋转,然后旋转Y以与Z平面对齐

lx = costeta * cosfi;
ly = -sinteta * cosfi;
lz = sinfi;

mx = sinteta;
my = costeta;
mz = 0;

nx = -sinfi * costeta;
ny = sinfi * sinteta;
nz = cosfi;

var np1:Object = {};
np1.x=p1.x*lx + p1.y*ly + p1.z*lz;
np1.y=p1.x*mx + p1.y*my + p1.z*mz;
np1.z=p1.x*nx + p1.y*ny + p1.z*nz;

var np2:Object = {};
np2.x=p2.x*lx + p2.y*ly + p2.z*lz;
np2.y=p2.x*mx + p2.y*my + p2.z*mz;
np2.z=p2.x*nx + p2.y*ny + p2.z*nz;

var np3:Object = {};
np3.x=p3.x*lx + p3.y*ly + p3.z*lz;
np3.y=p3.x*mx + p3.y*my + p3.z*mz;
np3.z=p3.x*nx + p3.y*ny + p3.z*nz;

使用确定平面的法线。然后,确定表示轴旋转的轴。旋转多边形,完成工作,然后将其旋转回去

通过从“w”=0的向量创建四元数,可以通过四元数旋转向量:

v=(x,y,z) q=(w=0,x,y,z)

按q2旋转

rv=q2*q*q2^-1

要将rv转换为点,请删除w(即0)

要再次向后旋转,请使用

q2^-1*rv*q

其中q2^-1是q2的逆或共轭

编辑2

<>对C++代码的补充,但这里是我的向量3d和四元数类如何工作(简化):

使用这种数学方法,你可以用“对齐”方法创建一个四元数,表示从垂直于z轴的平面旋转(即v1为平面法线[归一化],v2为z轴单位向量)-我们称之为Q。要旋转每个点,p,你需要为点创建一个四元数,Q,旋转它,qr,然后将q转换回点p2,如下所示:

q = Quaternion(0, p.x, p.y, p.z);
qr = Q * q * Q.inverse();
p2 = Vector3d(qr.x, qr.y, qr.z);
要再次旋转p2,请执行以下操作:

q = Quaternion(0, p2.x, p2.y, p2.z);
qr = Q.inverse() * q * Q;
p = Vector3d(qr.x, qr.y, qr.z);

旋转三角形几乎肯定是错误的方法。如果要修改三角形,则只需在其当前(3d)坐标系中执行操作。如果您的目的不是修改三角形,则不需要将其向后旋转。如果您不知道如何在当前坐标系中执行所需的操作,请提出该问题。

我不确定是否理解该问题。你能举一个简单的例子来说明如何旋转一个简单的多边形吗?请注意,对于许多操作,特别是布尔操作,简单地投影到x/y平面(忽略z或将其设置为0)将产生相同的结果,但可能仍然需要将结果“向后”转换。谢谢你的回答,sje,我已经实现了您所说的,但我面临一个问题:我不知道如何将点旋转回其默认位置。
q = Quaternion(0, p2.x, p2.y, p2.z);
qr = Q.inverse() * q * Q;
p = Vector3d(qr.x, qr.y, qr.z);