Three.js 像旋转控件一样旋转对象,但仅旋转对象本身

Three.js 像旋转控件一样旋转对象,但仅旋转对象本身,three.js,Three.js,我们爱三个!这是我们几年前用它构建的一个页面。 我们正在修改这个网站上的动画 加载页面后,用户可以拖动和旋转对象。但这确实是一个骗局。我们使用“动态观察”控件围绕场景旋转摄影机,从而旋转场景中居中的主要对象(位置x、y、z均等于0)。如果我们没有将对象放置在中心,它的旋转开始看起来不均匀,因为摄影机现在正在围绕对象没有的中心旋转 为了使对象看起来像在左侧,我们最终将画布向左移动,然后在滚动后动画继续时将其移回右侧或左侧 所以,我的问题是。。有没有人举过一个例子,说明如何通过旋转实际对象本身来实

我们爱三个!这是我们几年前用它构建的一个页面。

我们正在修改这个网站上的动画

加载页面后,用户可以拖动和旋转对象。但这确实是一个骗局。我们使用“动态观察”控件围绕场景旋转摄影机,从而旋转场景中居中的主要对象(位置x、y、z均等于0)。如果我们没有将对象放置在中心,它的旋转开始看起来不均匀,因为摄影机现在正在围绕对象没有的中心旋转

为了使对象看起来像在左侧,我们最终将画布向左移动,然后在滚动后动画继续时将其移回右侧或左侧

所以,我的问题是。。有没有人举过一个例子,说明如何通过旋转实际对象本身来实现此功能,而不是使用“动态观察控制”插件在整个场景中旋转摄影机


还是要修改轨道控制,使其围绕一个对象而不是整个场景旋转?

我已经搜索了一段时间,但在问了这个问题之后,我发现了这个链接,它实际上有一个我们正在尝试做的示例。

从链接复制这项工作的关键:(虽然我不是100%确定这一切意味着什么)


如果您想要一篇关于如何在不使用不必要的jquery依赖项的情况下实现这一点的文章,您可以看看

这使用eventListener在发生
mousedown
事件时查找
mousemove
事件,然后将坐标传递给自定义函数

var mouseDown=false,
mouseX=0,
mouseY=0;
var canvas=renderer.domeElement
canvas.addEventListener('mousemove',函数(evt){
如果(!mouseDown){return}
//console.log('drag')
evt.preventDefault();
var deltaX=evt.clientX-mouseX,
deltaY=evt.clientY-mouseY;
mouseX=evt.clientX;
mouseY=evt.clientY;
//在这里用X和Y做点什么
object.rotation.x+=deltaX
},假);
canvas.addEventListener('mousedown',函数(evt){
evt.preventDefault();
mouseDown=true;
mouseX=evt.clientX;
mouseY=evt.clientY;
},假);
canvas.addEventListener('mouseup',函数(evt){
evt.preventDefault();
mouseDown=false;
},假);
}
但这并不是说,如果导入了OrbitControl或DragControl,这将不起作用

/* */
var isDragging = false;
var previousMousePosition = {
    x: 0,
    y: 0
};
$(renderer.domElement).on('mousedown', function(e) {
    isDragging = true;
})
.on('mousemove', function(e) {
    //console.log(e);
    var deltaMove = {
        x: e.offsetX-previousMousePosition.x,
        y: e.offsetY-previousMousePosition.y
    };

    if(isDragging) {

        var deltaRotationQuaternion = new three.Quaternion()
            .setFromEuler(new three.Euler(
                toRadians(deltaMove.y * 1),
                toRadians(deltaMove.x * 1),
                0,
                'XYZ'
            ));

        cube.quaternion.multiplyQuaternions(deltaRotationQuaternion, cube.quaternion);
    }

    previousMousePosition = {
        x: e.offsetX,
        y: e.offsetY
    };
});
/* */