【问题标题】:Separate quaternion 1 and quaternion 2 away from each other by amount of degrees?按度数将四元数 1 和四元数 2 分开?
【发布时间】:2020-03-28 15:44:54
【问题描述】:

如何按度数将四元数 1 和四元数 2 分开?

<--q1q2--> to <--q1---q2-->

我尝试了 slerp 的插值值为 1.1 - 这是正确的方向。但我需要用固定的设定值更新四元数。否则 q1 和 q2 之间的距离在每次更新之间呈指数增长。

编辑: 在单轴上查看它时:Q1<-20°->Q2以某种方式 更改 Q2 之后 - 它会变为或变为答案中提到的 Q3:Q1<-30°->Q2orQ3 当想要将涉及的四元数之一与 10° 分开时。请注意,这必须是提到的正确方向/slerp 方向。

我的问题可以描述为试图将碰撞物理添加到围绕用户旋转的游戏对象中——这样它们就不会重叠和相互覆盖。同时尽可能远离原来的位置。

我的需要是让游戏对象与用户保持相同的旋转以停止堆叠 - 并改为形成集群。这样每个对象都可以看到并与之交互。

我正在使用System.Numerics C# Quaternion

【问题讨论】:

  • 我不知道,抱歉。祝你好运。

标签: game-physics quaternions


【解决方案1】:

我认为这可以满足您的要求:
0) 假设您有 Q1 和 Q2,并希望 Q3 从 Q1 到 Q2 10 度:
1) 获取 Q1 和 Q2 之间的角度。
2) Q3.w = Q1.w * cos(10deg) / cos(角度)
3) Q3.x = Q1.x * sin(10deg) / sin(角度)
4) Q3.y 和 Q3.z 相同。

您必须检查 Q1 = Q2。

如果您愿意,我可以添加一个 javascript(使用 three.js 库)。

【讨论】:

  • 感谢您的回答。我试图在我的问题中进一步澄清。
【解决方案2】:
void Apart(Quaternion q1, Quaternion q2)
{
    var angle = Calc.ToRad(0.4f);
    var vector = new Vector3(1, 1, 0); // new Vector(1, 1, 1) if 3d probably!
    someObj1.Orientation = q1 * Quaternion.CreateFromAxisAngle(vector, angle);
    someObj2.Orientation = q2 * Quaternion.CreateFromAxisAngle(vector, -angle);
}

这导致堆叠的对象分开动画 - 在我的移动应用程序中创建对象的对角线,以 2D 形式在屏幕上显示由Orientation 给出的对象。

所以只在一个轴上分开: var vector = new Vector3(0, 1, 0); 表示:<OO> . <O-O> .. <O--O> 每次更新


编辑

实际上,vector 必须在所有轴上分别进行分解和角度相乘。

// where UnitX is (1, 0, 0) and UnitY (0, 1, 0)
someObj1.Orientation = q1 * Quaternion.CreateFromAxisAngle(Vector3.UnitX, xAngle) * Quaternion.CreateFromAxisAngle(Vector3.UnitY, yAngle); 
someObj2.Orientation = q2 * Quaternion.CreateFromAxisAngle(Vector3.UnitX, -xAngle) * Quaternion.CreateFromAxisAngle(Vector3.UnitY, -yAngle);

由于我需要以特定角度和 2D 分隔,因此我可以简单地从该角度中取出百分比:

var angle = Calc.ToRad(0.4f);
var makePortions = new Random().NextDouble();
var xAngle = (float)(angle * makePortions);
var yAngle = (float)(angle * (1 - makePortions));

否则 X 轴的角度变化将停止对大约 180 度 Y 轴方向的对象方向产生影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 2018-04-05
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多