旋转一个球体在三个轴不工作,如果使用一个循环
Rotating a sphere in threejs not working if using a loop
我想让一个球体在点击按钮时旋转一定次数(次数由用户选择)。由于旋转的次数是开放的,我认为在for
循环中完成它是最简单的:
$('#clickme').on('click', function () {
var multiple = 4; //Change this value to rotate at different angles
var rotationVector = new THREE.Vector3(0,1,0);
var angle = ((360 / multiple) * Math.PI) / 180;
for (var i = 0; i < multiple; i++) {
sphere.rotateOnAxis(rotationVector, angle);
alert(i);
}
});
alert
现在只是一个占位符,但我确实希望在每次旋转后完成其他事情。这里的问题是旋转永远不会完成。没有错误,它击中了那行代码,但是对象永远不会旋转。如果我将sphere.rotateOnAxis
从for循环中取出,那么它就可以正常工作(至少每次点击旋转一次)。我已经尝试了各种方法来重新渲染场景,但从来没有做任何事情。
这里的工作示例:http://jsfiddle.net/weatL3nc/2/
注意你在做什么:
var angle = ((360 / multiple) * Math.PI) / 180;
将360度(或2 π弧度)分成n片得到一个角。这里:
for (var i = 0; i < multiple; i++) {
sphere.rotateOnAxis(rotationVector, angle);
}
以这个角度旋转n次。这意味着不管multiple
是什么,在for循环的最后,你会精确地旋转360度。换句话说,如果是工作,你就不会注意到它,因为下一次它绘制屏幕时,球体将会回到它之前的位置。
作为一种选择,你可以尝试使用setInterval
来允许屏幕在帧之间重新绘制,像这样:
$('#clickme').on('click', function () {
var multiple = 2; //Change this value to rotate at different angles
var rotationVector = new THREE.Vector3(0,1,0);
var angle = ((360 / multiple) * Math.PI) / 180;
var frame = 0;
var ival = setInterval(function() {
sphere.rotateOnAxis(rotationVector, angle);
frame++;
alert('Frame ' + frame + ' of ' + multiple);
if (multiple == frame)
clearInterval(ival);
}, 1);
});
要等待渲染完成,您可以实现setTimeout()
而不是for
循环,间隔足够高以等待渲染:
var iteration = 0;
var multiple = 4;
var interval = 100; // ms
var angle = ((360 / multiple) * Math.PI) / 180;
function rotateAndSave() {
iteration++;
sphere.rotateOnAxis(rotationVector, angle);
//alert(iteration);
if (iteration < maxIterations) setTimeout(rotateAndSave, interval);
}
点击时调用这个函数:
rotateAndSave();
http://jsfiddle.net/weatL3nc/6/相关文章:
- 当单元格内容由于forumula从另一个工作表编译数据而更改时发送电子邮件
- 当源工作表添加了行时,如何编写在一个工作表中添加行的脚本
- 如何在jquery中为object键创建一个工作变量以避免额外的代码
- 是否有可能在 threejs 中创建一个工作的计算机界面
- Javascript .call() 用法.一个工作案例,一个不是.有什么区别
- 我可以在 MVC 3.0 中获得一个工作 Asp.NET jsTree 4 示例,并异步加载节点
- 将数据从一个工作表复制到另一个工作表;使用目标工作表中的复制数据创建一个表
- 即使我从另一个工作小提琴复制代码,JSFiddle 也不起作用
- dojo's registry.findWidgets() 的一个工作示例
- 根据条件将行从一个工作表复制到另一个工作表
- 你如何使用JavaScript制作一个工作时钟
- 网络音频Api:我如何添加一个工作卷积器
- 我想编辑一个工作的javascript代码来增加它的功能
- 多个谷歌图表,只有一个工作
- 选择一个工作的国家
- jQuery Ajax的两个相同的函数为其中一个工作,而不是另一个
- 两次相同的onclick功能-只有一个工作
- 是否有一个工作的qrCode阅读器在Js/Jquery那里
- 将一个工作的jQuery表单复制到另一个位置,但只复制原来的工作
- 在两个不同的工作表中查找具有相同列的选定行,并将其从其中一个工作表中删除