围绕其 centeroid/axis 旋转 3D 形状
Rotate 3D shape around its centeroid/axis
我在 STL 文件中定义了一个 3D 形状,我想使用 Yaw、Pitch 和 Roll 围绕它的 axis/center 旋转它。但是,我已经实施了一个解决方案,但它并没有像预期的那样工作,因为 它绕原点轴旋转 3D 形状而不是 。这是我到目前为止所做的(写在PHP):
function rotate($vertices, $roll = 0, $pitch = 0, $yaw = 0)
{
if(!empty($vertices))
{
$cosa = cos($yaw);
$sina = sin($yaw);
$cosb = cos($pitch);
$sinb = sin($pitch);
$cosc = cos($roll);
$sinc = sin($roll);
$Axx = $cosa * $cosb;
$Axy = $cosa * $sinb * $sinc - $sina * $cosc;
$Axz = $cosa * $sinb * $cosc + $sina * $sinc;
$Ayx = $sina * $cosb;
$Ayy = $sina * $sinb * $sinc + $cosa * $cosc;
$Ayz = $sina * $sinb * $cosc - $cosa * $sinc;
$Azx = -$sinb;
$Azy = $cosb * $sinc;
$Azz = $cosb * $cosc;
//loop through all triangles
foreach($vertices as $i => $vertex)
{
$px = $vertex->x;
$py = $vertex->y;
$pz = $vertex->z;
$points =
[
'x' => ($Axx * $px + $Axy * $py + $Axz * $pz),
'y' => ($Ayx * $px + $Ayy * $py + $Ayz * $pz),
'z' => ($Azx * $px + $Azy * $py + $Azz * $pz)
];
//update the vertex
$vertices[$i]->setVertex($vi, $points);
}
}
return $vertices;
}
如果我遗漏了什么,请告诉我。任何帮助将不胜感激。
上面的代码绕原点旋转。如果您的旋转中心(例如 $c)不是原点,您可以在旋转之前移动对象:
$px = $vertex->x - $c->x;
$py = $vertex->y - $c->y;
$pz = $vertex->z - $c->z;
旋转后,将点移回旋转中心:
$points =
[
'x' => ($Axx * $px + $Axy * $py + $Axz * $pz) + $c->x,
'y' => ($Ayx * $px + $Ayy * $py + $Ayz * $pz) + $c->y,
'z' => ($Azx * $px + $Azy * $py + $Azz * $pz) + $c->z
];
我在 STL 文件中定义了一个 3D 形状,我想使用 Yaw、Pitch 和 Roll 围绕它的 axis/center 旋转它。但是,我已经实施了一个解决方案,但它并没有像预期的那样工作,因为 它绕原点轴旋转 3D 形状而不是 。这是我到目前为止所做的(写在PHP):
function rotate($vertices, $roll = 0, $pitch = 0, $yaw = 0)
{
if(!empty($vertices))
{
$cosa = cos($yaw);
$sina = sin($yaw);
$cosb = cos($pitch);
$sinb = sin($pitch);
$cosc = cos($roll);
$sinc = sin($roll);
$Axx = $cosa * $cosb;
$Axy = $cosa * $sinb * $sinc - $sina * $cosc;
$Axz = $cosa * $sinb * $cosc + $sina * $sinc;
$Ayx = $sina * $cosb;
$Ayy = $sina * $sinb * $sinc + $cosa * $cosc;
$Ayz = $sina * $sinb * $cosc - $cosa * $sinc;
$Azx = -$sinb;
$Azy = $cosb * $sinc;
$Azz = $cosb * $cosc;
//loop through all triangles
foreach($vertices as $i => $vertex)
{
$px = $vertex->x;
$py = $vertex->y;
$pz = $vertex->z;
$points =
[
'x' => ($Axx * $px + $Axy * $py + $Axz * $pz),
'y' => ($Ayx * $px + $Ayy * $py + $Ayz * $pz),
'z' => ($Azx * $px + $Azy * $py + $Azz * $pz)
];
//update the vertex
$vertices[$i]->setVertex($vi, $points);
}
}
return $vertices;
}
如果我遗漏了什么,请告诉我。任何帮助将不胜感激。
上面的代码绕原点旋转。如果您的旋转中心(例如 $c)不是原点,您可以在旋转之前移动对象:
$px = $vertex->x - $c->x;
$py = $vertex->y - $c->y;
$pz = $vertex->z - $c->z;
旋转后,将点移回旋转中心:
$points =
[
'x' => ($Axx * $px + $Axy * $py + $Axz * $pz) + $c->x,
'y' => ($Ayx * $px + $Ayy * $py + $Ayz * $pz) + $c->y,
'z' => ($Azx * $px + $Azy * $py + $Azz * $pz) + $c->z
];