【问题标题】:three.js orbit object around a changing axisthree.js 围绕一个变化的轴轨道对象
【发布时间】:2018-09-21 00:29:41
【问题描述】:

我有一个简单的 3D 对象,我可以旋转,即用鼠标左键围绕轴中心移动 - 工作正常。当我使用鼠标右键平移时,轴也会移动,因此它不再围绕当前轴移动。

无论我将对象拖动到何处,我如何才能围绕其当前轴移动对象? 下面是script.js的完整代码

var scene = new THREE.Scene();

var axisHelper = new THREE.AxisHelper(100);
scene.add(axisHelper);

var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
camera.position.y = -200;

var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

var controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.25;
controls.enableZoom = true;

var keyLight = new THREE.DirectionalLight(new THREE.Color('hsl(30, 100%, 75%)'), 1.0);
keyLight.position.set(-100, 0, 100);

var fillLight = new THREE.DirectionalLight(new THREE.Color('hsl(240, 100%, 75%)'), 0.75);
fillLight.position.set(100, 0, 100);

var backLight = new THREE.DirectionalLight(0xffffff, 1.0);
backLight.position.set(100, 0, -100).normalize();

scene.add(keyLight);
scene.add(fillLight);
scene.add(backLight);

var mtlLoader = new THREE.MTLLoader();
mtlLoader.setTexturePath('assets/');
mtlLoader.setPath('assets/');
mtlLoader.load('180319_object01.mtl', function (materials) {

    materials.preload();

    var objLoader = new THREE.OBJLoader();
    objLoader.setMaterials(materials);
    objLoader.setPath('assets/');
    objLoader.load('180319_object01.obj', function (object) {
    object.scale.set( 200, 200, 200 );
    scene.add(object);


    object.position.x = -100;
    object.position.y = -100;
    object.position.z = 0;
    });
});

var animate = function () {
    requestAnimationFrame( animate );
    controls.update();
    renderer.render(scene, camera);
};

animate();

【问题讨论】:

    标签: object three.js rotation axis


    【解决方案1】:

    这是因为您的相机是由控制器而不是物体本身移动的,而不是更新相机的位置和方向((即轨道控制器正在执行的操作)。在您的渲染方法中,您需要更新对象本身的位置和欧拉角以达到所需的效果。为此,您需要在对象(模型)空间中跟踪和更新围绕对象(y?)轴的位置和旋转角度.希望这是有道理的,如果您需要我详细说明,请告诉我。

    【讨论】:

    • 是的,我知道平移意味着移动相机。这意味着,我既没有移动对象也没有移动轴。但是你从我的问题中意识到,在用我的鼠标右键拖动之后,现在对象没有像以前那样围绕它的轴旋转,即在拖动之前。您可以在这里尝试3dviewer.net 只需上传并反对并测试它。这就是我想要完成的。
    • 能否请您包含鼠标移动处理程序中的代码?具体来说就是左/右拖拽代码,让我看看那里是怎么回事?
    • 我已经放在这里的整个主要代码。它没有任何鼠标处理功能。这是所有默认的three.js鼠标功能,即鼠标左键将旋转/轨道,中间滚动按钮将放大和缩小,鼠标右键平移相机(即对象被拖动)。由于这些是默认的three.js函数,所以我不需要添加任何鼠标函数。
    • 在对三个和不同的控制器选项进行一些修改之后,我想说你最好的选择是自己管理 MTL 对象的位置和旋转。这使您可以灵活地更改对象在本地或世界空间中的方向和位置。这样做应该相当简单;只需将mousemove 事件侦听器添加到您的document 并跟踪移动事件之间的鼠标增量。使用此鼠标增量可围绕其 Y 轴旋转对象或平移,具体取决于鼠标右键是否按下。希望这会有所帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2017-07-14
    • 2015-06-15
    • 1970-01-01
    相关资源
    最近更新 更多