小编Bra*_* H.的帖子

计算旋转以将对象与 3D 空间中的两点对齐

我正在处理动作捕捉数据,我想在处理中进行“蒙皮”。因此,基本上,我从数据中获得的每两个点都必须在其间添加一个 3D 对象(我现在将使用一个盒子,放置和旋转坐标是 3D 对象的中心)并旋转它,以便它在所有三个维度上与连接两点的向量对齐。

在这里,我们可以在左侧看到两点之间最初放置的框,在右侧看到现在正确旋转的框: 白色平行六面体的分割图像,未与图像左侧的红色对角线(左上到右下)对齐,并且白色平行六面体与图像右侧的红线对齐

我知道在处理中旋转对象的唯一方法是使用rotateX()、rotateY()、rotateZ()函数,它们使用欧拉角围绕全局(?)轴旋转对象。

现在我正在努力寻找一种正确计算这种旋转的方法。

我已经编写了一个用于计算两个向量之间的角度的函数:

float calcVectorAngle(PVector p1, PVector p2) {
    return acos((p1.dot(p2)) / (mag(p1.x, p1.y, p1.z) * mag(p2.x, p2.y, p2.z)));
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试将向量(两点之间)与每个旋转轴之一的单位向量结合起来:

float x = calcVectorAngle(vector, new PVector(1,0,0));
float y = calcVectorAngle(vector, new PVector(0,1,0));
float z = calcVectorAngle(vector, new PVector(0,0,1));
Run Code Online (Sandbox Code Playgroud)

但是当我使用这些值旋转对象时,旋转完全关闭。

代码示例:

PVector p1;
PVector p2;
PVector boxSize = new PVector(500, 100, 100);

void setup() {
    size(1000,1000,P3D);
    p1 = new PVector(100, 100, 0);
    p2 = new PVector(900, 900, -1000);
}

void draw() {
    background(125);
    strokeWeight(2); …
Run Code Online (Sandbox Code Playgroud)

math processing euler-angles

4
推荐指数
1
解决办法
1146
查看次数

标签 统计

euler-angles ×1

math ×1

processing ×1