我在THREE.js中使用TrackballControls。旋转中心始终位于画布的中心。如何向上旋转中心?这是我尝试的:
向上移动场景(scene.translateY(1))-不好,旋转中心仍在画布中心
向上移动相机(camera.position.y = 1)-不好,我正在“向上”看,但是旋转中心仍然在画布的中心
更改控件目标(controls.target.y = 1)-不好,整个场景刚刚旋转,因此目标位于画布的中心。
window.addEventListener("DOMContentLoaded", function () {
var scene, camera, renderer, controls, sphere, red, blue, black;
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 3;
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
geometry = new THREE.SphereGeometry(0.1);
material = new THREE.MeshBasicMaterial({
color: 0xff0000
});
sphere1 = new THREE.Mesh(geometry, material);
scene.add(sphere1);
geometry = new THREE.SphereGeometry(0.1);
material = new THREE.MeshBasicMaterial({
color: 0x00ff00
});
sphere2 = new THREE.Mesh(geometry, material);
scene.add(sphere2);
sphere2.position.x = 1;
geometry = new THREE.SphereGeometry(0.1);
material = new THREE.MeshBasicMaterial({
color: 0x0000ff
});
sphere3 = new THREE.Mesh(geometry, material);
scene.add(sphere3);
sphere3.position.y = 1;
controls = new THREE.TrackballControls(camera, renderer.domElement);
function loop() {
controls.update();
renderer.render(scene, camera);
requestAnimationFrame(loop);
}
// camera.position.y = 1;
// controls.target.y = 1;
// scene.position.y = 1;
loop();
})
canvas {
box-sizing: border-box;
border: 1px solid red;
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
<script src="https://rawgit.com/mrdoob/three.js/master/build/three.min.js"></script>
<script src="https://rawgit.com/mrdoob/three.js/master/examples/js/controls/TrackballControls.js"></script>
我想围绕红色球体旋转,并且我希望红色球体不在画布中心,而是在上部三分之一。
您所描述的内容在数学上有点复杂,因为相机总是“注视”目标,这意味着它总是会居中。您也不能只旋转照相机向下看几度,因为它TrackballControls
绕z轴旋转,这使得更难弄清“向下”的位置。
也许您可以使用来更改渲染器的视口renderer.setViewport()
?这会将场景压缩到您提供的尺寸中,因此您可以将其定位在任意位置。在下面的演示中,我将场景渲染2次,一次渲染全屏,第二次渲染此代码仅高200px:
// First render takes up the full screen
renderer.setViewport(0, 0, window.innerWidth, window.innerHeight);
renderer.render(scene, camera);
// Second render is only 100px tall
renderer.setViewport(0, 0, 100 * ratio, 100);
renderer.render(scene, camera);
如果此方法对您有效,请确保进行设置,renderer.autoClear = false;
以免每次render()
通话都清除画布。
window.addEventListener("DOMContentLoaded", function () {
var scene, camera, renderer, controls, sphere, red, blue, black;
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 3;
renderer = new THREE.WebGLRenderer();
renderer.autoClear = false;
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
geometry = new THREE.SphereGeometry(0.1);
material = new THREE.MeshBasicMaterial({
color: 0xff0000
});
sphere1 = new THREE.Mesh(geometry, material);
scene.add(sphere1);
geometry = new THREE.SphereGeometry(0.1);
material = new THREE.MeshBasicMaterial({
color: 0x00ff00
});
sphere2 = new THREE.Mesh(geometry, material);
scene.add(sphere2);
sphere2.position.x = 1;
geometry = new THREE.SphereGeometry(0.1);
material = new THREE.MeshBasicMaterial({
color: 0x0000ff
});
sphere3 = new THREE.Mesh(geometry, material);
scene.add(sphere3);
sphere3.position.y = 1;
controls = new THREE.TrackballControls(camera, renderer.domElement);
var ratio = window.innerWidth / window.innerHeight;
function loop() {
controls.update();
// First render takes up the full screen
renderer.setViewport(0, 0, window.innerWidth, window.innerHeight);
renderer.render(scene, camera);
// Second render is only 100px tall
renderer.setViewport(0, 0, 100 * ratio, 100);
renderer.render(scene, camera);
requestAnimationFrame(loop);
}
// camera.position.y = 1;
// controls.target.y = 1;
// scene.position.y = 1;
loop();
})
canvas {
box-sizing: border-box;
border: 1px solid red;
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
<script src="https://rawgit.com/mrdoob/three.js/master/build/three.min.js"></script>
<script src="https://rawgit.com/mrdoob/three.js/master/examples/js/controls/TrackballControls.js"></script>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句