Autodesk Platform Services Viewer:如何让相机与选中模型面垂直?
解决Viewer中相机垂直对准选中模型面的问题
方案一:修正坐标系转换,将局部法线转为世界空间法线
你遇到的核心问题是hitTest()返回的法线属于模型片段的局部坐标系,而相机操作基于世界坐标系,只需完成坐标转换即可解决:
- 从
hitTest结果中提取目标面的dbId、局部法线localNormal,以及世界空间下的点击点hitPoint - 获取该片段的世界变换矩阵:
const worldMatrix = viewer.model.getFragmentList().getWorldMatrix(dbId); - 将局部法线转换为世界空间法线(法线是方向向量,仅需应用矩阵的旋转分量,排除平移影响),用
THREE.Vector3处理更便捷:
const worldNormal = new THREE.Vector3(localNormal.x, localNormal.y, localNormal.z); worldNormal.applyMatrix4(worldMatrix).normalize();
- 计算相机位置:以点击点为目标,沿世界法线方向后退一段适配模型大小的距离(比如取模型包围盒对角线长度的1/2):
const offsetDistance = viewer.model.getBoundingBox().diagonalLength() * 0.5; const cameraPos = hitPoint.clone().add(worldNormal.multiplyScalar(offsetDistance));
- 设置相机朝向点击点:
viewer.navigation.setView(cameraPos, hitPoint); // 或更精细控制: viewer.camera.position.copy(cameraPos); viewer.camera.lookAt(hitPoint); viewer.impl.sceneUpdated(true);
方案二:直接基于片段世界矩阵推导视角
如果不想手动处理法线转换,也可以通过片段的世界矩阵直接构造相机朝向:
- 提取世界矩阵的旋转分量,片段局部坐标系中对应面法线的轴(比如局部Z轴),在世界空间的方向就是相机需要背离的方向,让相机看向点击点或片段中心即可。
注意事项
- 针对.dwfx格式模型,若
dbId对应组件而非单个面,需通过hitTest返回的face属性获取更精确的局部变换信息 - 动态调整相机后退距离时,避免距离过近导致模型超出视野,或过远导致模型显示过小
内容的提问来源于stack exchange,提问作者titanthomas6
相关产品推荐
相关产品推荐

