我正在處理動作捕捉資料,我想在處理程序中進行“蒙皮”。所以基本上我從我的資料中得到的每兩個點我必須在中間添加一個 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)));
}
然后我嘗試將矢量(在兩點之間)與每個旋轉軸之一的單位矢量相結合:
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));
但是當我使用這些值旋轉物件時,旋轉完全關閉。
一個代碼示例:
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);
stroke(255, 0, 0);
pushMatrix();
line(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z);
PVector midPoint = calcMidPoint(p1, p2);
translate(midPoint.x, midPoint.y, midPoint.z);
PVector rotation = calcRotation(p1, p2);
rotateX(rotation.x);
rotateY(rotation.y);
rotateZ(rotation.z);
box(boxSize.x, boxSize.y, boxSize.z);
popMatrix();
}
PVector calcMidPoint(PVector p1, PVector p2) {
return new PVector((p1.x p2.x) / 2, (p1.y p2.y) / 2, (p1.z p2.z) / 2);
}
PVector calcRotation(PVector p1, PVector p2) {
PVector vector = new PVector();
vector.sub(p2, p1, vector);
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));
return new PVector(x, y, z);
}
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)));
}
現在我有點失落。
uj5u.com熱心網友回復:
旋轉軸是框的默認方向 (1, 0, 0) 與沿線 ( )方向的
PVector p1, 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);
stroke(255, 0, 0);
line(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z);
PVector midPoint = p1.copy().add(p2).mult(0.5);
PVector currentDirection = new PVector(1, 0, 0);
PVector newDirection = p2.copy().sub(p1).normalize();
PVector rotationAxis = currentDirection.cross(newDirection).normalize();
float rotationAngle = acos(currentDirection.dot(newDirection));
pushMatrix();
translate(midPoint.x, midPoint.y, midPoint.z);
rotate(rotationAngle, rotationAxis.x, rotationAxis.y, rotationAxis.z);
box(boxSize.x, boxSize.y, boxSize.z);
popMatrix();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/337041.html
