我正在使用这两个函数来在我的three.js场景中旋转我的对象
// Rotate an object around an arbitrary axis in object space
function rotateAroundObjectAxis(object, axis, radians) {
rotationMatrix = new THREE.Matrix4();
rotationMatrix.makeRotationAxis(axis.normalize(), radians);
object.matrix.multiplySelf(rotationMatrix); // post-multiply
object.rotation.getRotationFromMatrix(object.matrix, object.scale);
delete rotationMatrix;
}
// Rotate an object around an arbitrary axis in world space
function rotateAroundWorldAxis(object, axis, radians) {
rotationMatrix = new THREE.Matrix4();
rotationMatrix.makeRotationAxis(axis.normalize(), radians);
rotationMatrix.multiplySelf(object.matrix); // pre-multiply
object.matrix = rotationMatrix;
object.rotation.getRotationFromMatrix(object.matrix, object.scale);
delete rotationMatrix;
}
其中rotationMatrix是全局变量。我对Javascript和Web应用程序开发缺乏经验,但我跟一个似乎向我传达的人说话,因为有时候我会把这些函数调用一次,我应该关注每次调用它创建新对象的事实。到目前为止,这没有给我带来任何问题,但我应该担心垃圾收集器最终无法跟上吗?据我所知,这里的delete关键字与C ++不同,只删除了引用。 当我在每个函数结束时调用它时,这会有帮助吗? 还有什么我可以做的除此之外还能使这个功能更有效以便可以调用它尽可能多地减少速度或最终使浏览器占用太多内存。
答案 0 :(得分:0)
在进一步摆弄这一点后,我学到了很多关于如何使用Chrome开发者工具的知识。此外,我已经重写了这些功能,我认为可能会稍微提高效率。我将不得不看看它是如何扩展的,但是分析工具似乎表明它们在内存和垃圾收集器上有点好。
然而,在世界空间中旋转的功能需要一个副本,以便不创建新的矩阵。总之如果我们不在每次调用时创建一个新的矩阵,我们不能简单地复制引用,我们必须复制矩阵。基本上,它归结为此副本或垃圾收集器开销是否会更昂贵。
// Rotate an object around an arbitrary axis in object space
var rotObjectMatrix= new THREE.Matrix4();
function rotateAroundObjectAxis(object, axis, radians) {
rotObjectMatrix.makeRotationAxis(axis.normalize(), radians);
object.matrix.multiplySelf(rotObjectMatrix); // post-multiply
object.rotation.getRotationFromMatrix(object.matrix, object.scale);
}
var rotWorldMatrix = new THREE.Matrix4();
// Rotate an object around an arbitrary axis in world space
function rotateAroundWorldAxis(object, axis, radians) {
rotWorldMatrix.makeRotationAxis(axis.normalize(), radians);
rotWorldMatrix.multiplySelf(object.matrix); // pre-multiply
object.matrix.copy(rotWorldMatrix);
object.rotation.getRotationFromMatrix(object.matrix, object.scale);
}
我不确定这是否会更好。我拍了这些截图。这个是使用 original functions ,而这个是 new functions 。似乎表明新的表现稍好一些。我不确定我是否能发现差异。
编辑:一旦我意识到updateMatrix功能,我想出了一个不同的功能。这避免了使用复制整个矩阵。这是新的世界轮换功能:/** Adds a rotation of rad to the obj's rotation about world's axis */
var rotWorldMatrix = new THREE.Matrix4();
function rotateWorldAxis(obj, axis, rad) {
rotWorldMatrix.makeRotationAxis(axis.normalize(), rad);
obj.updateMatrix();
rotWorldMatrix.multiplySelf(obj.matrix); // pre-multiply
obj.rotation.getRotationFromMatrix(rotWorldMatrix, obj.scale);
}