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