使用OrbitControls限制摄像机方位角

时间:2017-10-25 14:19:41

标签: three.js azimuth



因此,我使用Three.js构建体系结构可视化,用户应该能够做的事情之一就是点击事物并围绕它们运行。问题是相机能够穿过墙壁。我通过为每个可点击对象分配自己的限制方位角和极角来解决这个问题。

现在的问题是方位角从-PI到+ PI并且不可能在例如1.5和-2.4之间进行限制,因为它限制了“错误”的方式。我希望这幅图解释得更好一点:

enter image description here

以下是实时版本的链接: (你可以通过点击地面来控制)

https://jim-fx.com/modern/

正如您所看到的,在房间右侧的物体上,限制工作完美无瑕,但是在机柜和花瓶上,相机会穿过墙壁。

如果有人能帮助我那将是惊人的。欢迎任何其他的tipps。

问候,Max

1 个答案:

答案 0 :(得分:0)

您的问题有几种解决方案。一种是为相机实现一种真实或虚拟墙的碰撞检测,停止旋转。但是,我想你正在寻找更简单的实现方法。

由于我不太了解Three.js,我将为您提供一个通用解决方案,但应该很容易适应Three.js。

第一件事是不使用内置的Three.js轨道控制,而是实现自己的控制所有转换。而且,事实上这很容易。

要创建一个可轨道的相机,您只需要创建:

  • “null”可变形对象,表示不嵌入任何形状的简单可变形实体(未呈现,不可见,但存在)。我希望Three.js提供如此基本的东西。

  • 一台相机,它本身应该是另一种可转换的。

完成此操作后,您只需将相机设为“null”对象即可。现在是“null”对象的父级,如果旋转“null”对象,则使用旋转相机。然后到轨道,你现在必须从父对象移回相机:

     Null                Camera

       + - - - - - - - - - |> 

像这样,“null”对象变成了相机“看点”,如果你围绕Y旋转“null”对象(我相信Three.js使用Y),你可以控制相机的方位角。如果在X或Z(取决于坐标系)中旋转“null”对象,则将控制摄像机高度。然后,您甚至可以通过在本地Z轴上移动相机来前后控制相机以关闭“看点”。

嗯,你现在有一个易于控制的轨道相机。但是你的问题还没有解决:如何在每个摄像机初始方向上实现这种控制Pi / -Pi?

简单:您创建第二个“null”变换对象,将其命名为“socle”,并将第一个变为最后一个:就像这样,摄像机“看点”的旋转始终是局部的,并且你现在可以旋转“the socle”给你的“轨道相机”组,这是世界空间的初始定位。

事实上,它非常像创建虚拟平衡环。我希望我很清楚,通过图片,这将更容易想象......