我有一个Three.js v72dev场景,由通过THREE.ObjectLoader导入的对象组成。这很好用。
我现在正在导入从我的CAD包转换为Three.js相机的相机。当我使用OrbitControls移动相机时,我开始遇到问题。使用一台摄像机,人们不会注意到差异,但是对于多台摄像机,您会开始看到移动摄像机会影响其他摄像机。你可以在这里看到这个效果: http://datable.net/WebGL/Iris0.3.0_Demo/
加载场景后,您可以打开视图以在不同的摄像机之间切换。移动一台摄像机,切换到另一台摄像机,四处移动,切换回等等。您将看到摄像机相互影响。
我想问题是我在更换相机时设置主相机变量的方式:
camera = someOtherCameraStoredInArrayOrObject;
我确实有一个工作样本,但我想知道是否有更简洁的方法来解决它。以下是一个有效的示例:http://datable.net/WebGL/Cameras/
我采取了不同的方法,当我切换相机时,我做了类似的事情:
camera = new THREE.PerspectiveCamera(camera1.fov, window.innerWidth/window.innerHeight, camera1.near, camera1.far );
camera.position.copy(camera1.position);
camera.rotation.copy(camera1.rotation);
controls = new THREE.OrbitControls(camera);
问题在于,每次我通过OrbitControls更改视图时,我都需要像这样更新存储的摄像头:
function camUpdate(otherCam){
otherCam.position.copy(camera.position);
otherCam.rotation.copy(camera.rotation);
}
对我来说似乎有点麻烦。还有其他优雅的解决方案来处理各种相机之间的切换控制和视图吗?
答案 0 :(得分:1)
尝试了几种不同的方法后,我的所有情况似乎都有效。在这种方法中,我保留了一个主摄像头和一组控件(此应用程序只有一个'视口')。我想切换的摄像机是currentCamera
导入的。每个都有一个唯一的ID,我将其保存在function onViewChange(event) {
//save current camera params
var cam = scene.getObjectByName( currentCamera );
cam.position.copy(camera.position);
cam.rotation.copy(camera.rotation);
cam.userData[0].tX = controls.target.x;
cam.userData[0].tY = controls.target.y;
cam.userData[0].tZ = controls.target.z;
//set next camera positions
var cam = scene.getObjectByName( event.detail.view );
currentCamera = event.detail.view;
camera = new THREE.PerspectiveCamera(cam.fov, window.innerWidth / window.innerHeight, cam.near, cam.far);
camera.position.copy(cam.position);
camera.rotation.copy(cam.rotation);
controls = new THREE.OrbitControls(camera);
controls.target = new THREE.Vector3( cam.userData[0].tX, cam.userData[0].tY, cam.userData[0].tZ );
}
变量中。我有一个返回所需相机的事件。此事件触发以下功能:
Dim CopyFrom As Object
Dim CopyTo As Object
Dim CopyThis As Object
Dim xl As Object
xl = CreateObject("Excel.Application")
xl.Visible = False
CopyFrom = xl.Workbooks.Open("E:\EXCEL\From.xls")
CopyTo = xl.Workbooks.Open("E:\EXCEL\To.xls")
For i = 0 To 1
''To use a password: Workbooks.Open Filename:="Filename", Password:="Password"
If i = 0 Then
CopyThis = CopyFrom.Sheets(1)
CopyThis.Copy(After:=CopyTo.Sheets(CopyTo.Sheets.Count))
CopyTo.Sheets(3).Name = "Sheet3"
Else
CopyThis = CopyFrom.Sheets(2)
CopyThis.Copy(After:=CopyTo.Sheets(CopyTo.Sheets.Count))
CopyTo.Sheets(4).Name = "Sheet4"
End If
Next
CopyTo.Sheets(1).Activate()
CopyTo.Save()
'CopyTo.SaveAs("E:\EXCEL\Check.xls")
xl.Quit()
我想我可以清理我如何存储控制目标数据,但是现在,这似乎回答了我想要做的事情,即在导入的摄像机之间切换而不是让控件摆脱不了。
这是一个更新的演示,正如我所希望的那样:http://datable.net/WebGL/camTest5/