的目标是什么?:,我想知道一个点在旋转三维物体(长方体)后的新坐标,围绕着另一边的锚点(x,y& z)。
我所做的:,我尝试用以下函数计算位置。由于Autodesk Inventor,我不得不将doubles转换为floats。注意:Vector是从origin /anchorpoint到指定点的区别。
Vector3 coordinateTransformation(Vector3 vector, float r_x, float r_y, float r_z, Vector3 origin)
{
vector.X = vector.X; //Just for demonstration
vector.Y = vector.Y * Convert.ToSingle(Math.Cos(DegreesToRadians(r_x))) - vector.Z * Convert.ToSingle(Math.Sin(DegreesToRadians(r_x)));
vector.Z = vector.Y * Convert.ToSingle(Math.Sin(DegreesToRadians(r_x))) + vector.Z * Convert.ToSingle(Math.Cos(DegreesToRadians(r_x)));
vector.X = vector.X * Convert.ToSingle(Math.Cos(DegreesToRadians(r_y))) + vector.Z * Convert.ToSingle(Math.Sin(DegreesToRadians(r_y)));
vector.Y = vector.Y; //Just for demonstration
vector.Z = vector.Z * Convert.ToSingle(Math.Cos(DegreesToRadians(r_y))) - vector.X * Convert.ToSingle(Math.Sin(DegreesToRadians(r_y)));
vector.X = vector.X * Convert.ToSingle(Math.Cos(DegreesToRadians(r_z))) - vector.Y * Convert.ToSingle(Math.Sin(DegreesToRadians(r_z)));
vector.Y = vector.X * Convert.ToSingle(Math.Sin(DegreesToRadians(r_z))) + vector.Y * Convert.ToSingle(Math.Cos(DegreesToRadians(r_z)));
vector.Z = vector.Z; //Just for demonstration
vector.X = Math.Abs(vector.X) + origin.X;
vector.Y = Math.Abs(vector.Y) + origin.Y;
vector.Z = Math.Abs(vector.Z) + origin.Z;
return vector;
}不知何故,物体没有被放置在正确的位置。
下一步:我在互联网上找到了一个做正确转换的网站。如果我手动将vector设置到网站上的计算点,其他一切都可以正常工作。,所以我必须在代码中得到完全相同的计算结果.
如果您需要更多的信息,请随时评论!
编辑: 1 :我想把2个物体(例如长方体)放在Inventor中的装配组中。每个对象都是一个锚点(原点),而另一侧则是一个连接点,它被描述为锚点与连接点本身之间的增量。首先,将一个对象放置在原点坐标上,然后围绕着锚点(度)旋转。此后,对象1的连接点坐标发生了变化。在下一步中,我希望将对象2及其原点放置在对象1的连接点上,而对象2与对象1具有相同的旋转。2 : Inventor使用右手坐标系。
发布于 2022-11-30 13:50:53
不要乱搞矢量和角度的手。对向量函数使用一些库,并使用矩阵进行转换。例如,System.Numerics或Math.Net.Numerics。
假设您有一个欧拉角开始,您可以使用CreateFromYawPitchRoll创建您的旋转矩阵。如果你想围绕一个特定的点旋转,你只需从你的所有点减去你的旋转中心,应用旋转并将点移回。这一切都可以通过仅仅乘以转换矩阵来实现:
var totalTransform = Matrix4x4.CreateTranslation(-rotationCenter) *
Matrix4x4.CreateFromYawPitchRoll(yawInRadians, pitchInRadians, rollInRadians) *
Matrix4x4.CreateTranslation(rotationCenter);要应用结果转换,只需调用Vector3.Transform生成一个新的转换向量。
如果你对线性代数有一些介绍的话,这一切都会容易一些。做一些事情也很常见,比如以错误的顺序应用转换,有时,在正确之前,只尝试一些不同的事情是最简单的。我也要指出,轮调是很难理解的。我倾向于喜欢四元数,而不是eutler角度,不是因为数学更容易理解,而是因为有像CreateFromAxisAngle这样的方法,我可以理解。
发布于 2022-12-01 00:09:20
当您手动将旋转应用到向量时,您需要一次更新所有组件(X、Y和Z),如下所示。
Vector3 coordinateTransformation(Vector3 vector, float r_x, float r_y, float r_z, Vector3 origin)
{
// In the rotation around X axis below, `Y relies on Z` and `Z relies on Y`. So both must be updated simultaneously.
vector = new Vector3(
vector.X,
vector.Y * Convert.ToSingle(Math.Cos(DegreesToRadians(r_x))) - vector.Z * Convert.ToSingle(Math.Sin(DegreesToRadians(r_x))),
vector.Y * Convert.ToSingle(Math.Sin(DegreesToRadians(r_x))) + vector.Z * Convert.ToSingle(Math.Cos(DegreesToRadians(r_x)))
);
vector = new Vector3(
vector.X * Convert.ToSingle(Math.Cos(DegreesToRadians(r_y))) + vector.Z * Convert.ToSingle(Math.Sin(DegreesToRadians(r_y))),
vector.Y,
vector.Z * Convert.ToSingle(Math.Cos(DegreesToRadians(r_y))) - vector.X * Convert.ToSingle(Math.Sin(DegreesToRadians(r_y)))
);
vector = new Vector3(
vector.X * Convert.ToSingle(Math.Cos(DegreesToRadians(r_z))) - vector.Y * Convert.ToSingle(Math.Sin(DegreesToRadians(r_z))),
vector.X * Convert.ToSingle(Math.Sin(DegreesToRadians(r_z))) + vector.Y * Convert.ToSingle(Math.Cos(DegreesToRadians(r_z))),
vector.Z
);
vector.X = Math.Abs(vector.X) + origin.X;
vector.Y = Math.Abs(vector.Y) + origin.Y;
vector.Z = Math.Abs(vector.Z) + origin.Z;
return vector;
}附录: Matrix4x4的使用
正如@JonasH所建议的,如果存在可靠的库,那么使用可靠的库是个好主意。
由于行向量是在.NET世界中使用的(虽然您的实现是基于列向量),所以X->Y->Z旋转可以用简单的矩阵乘法来编写,如下所示。
Vector3 coordinateTransformation(Vector3 vector, float r_x, float r_y, float r_z, Vector3 origin)
{
var mat = Matrix4x4.CreateRotationX(DegreesToRadians(r_x))
* Matrix4x4.CreateRotationY(DegreesToRadians(r_y))
* Matrix4x4.CreateRotationZ(DegreesToRadians(r_z));
vector = Vector3.Transform(vector, mat);
vector.X = Math.Abs(vector.X) + origin.X;
vector.Y = Math.Abs(vector.Y) + origin.Y;
vector.Z = Math.Abs(vector.Z) + origin.Z;
return vector;
}https://stackoverflow.com/questions/74627729
复制相似问题