Rotate 3D shape around its centeroid/axis

眉间皱痕 提交于 2019-12-20 06:38:38

问题


I have a 3D shape defined in STL file and I'd like to rotate it around its axis/center using Yaw, Pitch and Roll. However, I've already implemented a solution and it doesn't work as expected as it rotates the 3D shape around the origin axis instead. Here's what I've done so far (written in 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;
}

Please let me know if I'm missing something. any help would be appreciated.


回答1:


The code above rotates about the origin. If your centre of rotation (say, $c), isn't the origin, you can move the object before rotating:

$px = $vertex->x - $c->x;
$py = $vertex->y - $c->y;
$pz = $vertex->z - $c->z;

After rotating, move the point back to the centre of rotation:

$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
];


来源:https://stackoverflow.com/questions/59242195/rotate-3d-shape-around-its-centeroid-axis

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!