Babylon.js修改相机旋转目标且不自动将目标居中到屏幕的实现方法
实现方案
你要的效果可以通过**坐标投影计算targetScreenOffset**实现,全程不会改动当前视图:
- 首先明确
targetScreenOffset的单位规则:x、y取值范围均为[-1,1],分别对应屏幕从左到右、从下到上的全宽高,值为(0,0)时相机目标点对齐屏幕中心。 - 双击网格时执行以下逻辑:
// 1. 获取选中网格的世界中心坐标 const meshCenter = mesh.getBoundingInfo().boundingSphere.centerWorld; // 2. 将3D世界坐标投影为屏幕归一化坐标(取值范围0~1) const screenPos = BABYLON.Vector3.Project( meshCenter, BABYLON.Matrix.Identity(), scene.getTransformMatrix(), camera.viewport.toGlobal(engine.getRenderWidth(), engine.getRenderHeight()) ); // 3. 计算需要的targetScreenOffset值,抵消目标点切换带来的视图偏移 const offsetX = (0.5 - screenPos.x) * 2; const offsetY = (screenPos.y - 0.5) * 2; // 4. 赋值即可,无视图跳变 camera.target = meshCenter.clone(); camera.targetScreenOffset.set(offsetX, offsetY);
该方案完全兼容你已经实现的右键平移、左键旋转逻辑,不需要重构现有相机行为代码。
其他可选实现路径是通过修正ArcRotateCamera的alpha、beta、radius参数抵消目标点切换的偏移,但计算复杂度更高,不推荐。
内容的提问来源于stack exchange,提问作者Raphael Bresson
相关产品推荐
相关产品推荐

