开发者社区 问答 正文

围绕其中心点/轴旋转3D形状

我在STL文件中定义了3D形状,我想使用偏航角,俯仰和滚动将其围绕其轴/中心旋转。但是,我已经实现了一个解决方案,它不能像预期的那样工作,因为它绕原点轴旋转3D形状。到目前为止,这是我做过的事情(用PHP编写):

{
    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;
}

如果我缺少什么,请告诉我。任何帮助,将不胜感激。

展开
收起
社区秘书 2019-12-09 16:44:11 683 分享
分享
版权
举报
阿里云 AI 助理回答

你的问题在于直接在原始顶点坐标上应用旋转矩阵,而没有首先将模型中心平移到原点,然后再移回。这样会导致模型围绕世界坐标系的原点旋转,而不是自身中心。为了使3D形状绕其自身轴旋转,你需要遵循以下步骤:

  1. 计算模型中心:首先,需要确定你的3D模型的中心点。这通常是所有顶点坐标的平均值。

  2. 平移至原点:然后,将每个顶点相对于这个中心点平移,使得模型的中心位于世界坐标系的原点(0, 0, 0)。

  3. 应用旋转:接下来,使用你已经定义的旋转矩阵来旋转这些平移后的顶点。

  4. 平移回原位置:最后,将旋转后的顶点再次平移回原来的模型中心位置。

下面是修改后的代码示例(PHP):

function rotateAroundCenter($vertices, $yaw, $pitch, $roll)
{
    if(!empty($vertices))
    {
        // Step 1: Calculate the center of the model
        $center = array('x' => 0, 'y' => 0, 'z' => 0);
        foreach ($vertices as $vertex) {
            $center['x'] += $vertex->x;
            $center['y'] += $vertex->y;
            $center['z'] += $vertex->z;
        }
        $center['x'] /= count($vertices);
        $center['y'] /= count($vertices);
        $center['z'] /= count($vertices);

        // Step 2: Translate vertices to origin
        foreach ($vertices as $i => $vertex) {
            $vertices[$i]->setVertex(
                $i,
                [
                    'x' => $vertex->x - $center['x'],
                    'y' => $vertex->y - $center['y'],
                    'z' => $vertex->z - $center['z']
                ]
            );
        }

        // Your rotation matrix calculation remains the same...

        // Step 3: Apply rotation (your existing code)

        // Step 4: Translate back to original position
        foreach ($vertices as $i => $vertex) {
            $points = 
            [
                'x' => ($Axx * $px + $Axy * $py + $Axz * $pz) + $center['x'], 
                'y' => ($Ayx * $px + $Ayy * $py + $Ayz * $pz) + $center['y'], 
                'z' => ($Azx * $px + $Azy * $py + $Azz * $pz) + $center['z']
            ];
            $vertices[$i]->setVertex($i, $points);
        }
    }

    return $vertices;
}

请确保在实际应用中调整变量和函数调用以匹配你的具体实现细节。通过这样的处理,你应该能够成功地让3D形状绕其自身中心旋转了。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: