THREE.js TrackballControls如何更改旋转中心不在画布中心?

asdjfiasd

我在THREE.js中使用TrackballControls。旋转中心始终位于画布的中心。如何向上旋转中心?这是我尝试的:

  1. 向上移动场景(scene.translateY(1))-不好,旋转中心仍在画布中心

  2. 向上移动相机(camera.position.y = 1)-不好,我正在“向上”看,但是旋转中心仍然在画布的中心

  3. 更改控件目标(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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Three.js的中心旋转mergeometry对象

来自分类Dev

Three.js | OrbitControls | 如何换中心?

来自分类Dev

Three.js对象的“中心”是什么?

来自分类Dev

Three.js获得场景的中心

来自分类Dev

Three.js旋转

来自分类Dev

THREE.js中有什么方法可以旋转后获取圆柱的顶部中心吗?

来自分类Dev

如何使用react从three.js模块导入TrackballControls?

来自分类Dev

暂停/关闭three.js TrackballControls

来自分类Dev

fabric.js 围绕画布中心平滑地旋转对象

来自分类Dev

使用Three.js使用画布旋转纹理

来自分类Dev

将镜头对准Three.js中对象的中心

来自分类Dev

对象在拖动时以光标为中心(EventsControls + three.js)

来自分类Dev

Three.js和Dat.gui-TrackballControls renderer.domElement禁用旋转和平移

来自分类Dev

Three.js-如何使用Three.js冒烟?

来自分类Dev

如何安装Three.js?

来自分类Dev

如何更改three.js面孔的颜色?

来自分类Dev

在three.js动画中更改z旋转

来自分类Dev

在画布中渲染Three.js场景

来自分类Dev

Three.js画布行示例调整

来自分类Dev

获取面部旋转Three.js

来自分类Dev

three.js中旋转或惯用的方向

来自分类Dev

Three.js相机旋转错误

来自分类Dev

three.js旋转面向对象

来自分类Dev

加载文件的THREE.js旋转

来自分类Dev

Three.js旋转和定位几何

来自分类Dev

Three.js-相机旋转和TransformControls

来自分类Dev

在three.js中旋转对象

来自分类Dev

如何在three.js中使用Three.Triangle()

来自分类Dev

类型错误:无法读取未定义的属性“中心”(Three.js + React.js)