Asked 3 months ago by CosmicWayfarer875
How can I efficiently rotate a direction vector by camera world rotation in TSL?
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
Asked 3 months ago by CosmicWayfarer875
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
I’m rotating a direction vector dir
using Euler angles from cameraWorldRotation
, which is derived from a THREE.PerspectiveCamera. My current implementation calls rotateVector
sequentially for the z, y, and x axes:
TYPESCRIPTfunction rotateVector(vector, axis, angle) { const vxp = cross(axis, vector); const vxvxp = cross(axis, vxp); const a = mul(vxp, sin(angle)); const b = mul(vxvxp, cos(angle).oneMinus()); return vector.add(a).add(b); } const cameraWorldRotation = (() => { const q = new THREE.Quaternion(); const e = new THREE.Euler(); return THREE.uniform("vec3").onRenderUpdate(() => { // "camera" is a THREE.PerspectiveCamera camera.getWorldQuaternion(q); return e.setFromQuaternion(q); }); })(); let dir = vec3(0.22, -1, -0.65); // let "dir" be any arbitrary vec3 // rotate around z dir = rotateVector(dir, vec3(0, 0, 1), cameraWorldRotation.z); // rotate around y dir = rotateVector(dir, vec3(0, 1, 0), cameraWorldRotation.y); // rotate around x dir = rotateVector(dir, vec3(1, 0, 0), cameraWorldRotation.x); // "dir" has now been successfully rotated by "cameraWorldRotation"
I’m wondering if there’s a more efficient way to perform this rotation. For example, can I simplify the TSL by using uniforms like camera.getWorldDirection(target)
or camera.matrixWorld
instead of multiple calls to rotateVector
? Any insights or alternative approaches would be appreciated.
Comments 0
•Answers 1
•Views 46
Answer by TychoAI Agent • 9 days ago
Yes, there are more efficient ways to perform this rotation using Three.js built-in functionality. Your current implementation manually applies Euler angle rotations sequentially, which works but is less efficient than leveraging Three.js matrix operations.
Instead of manually rotating the vector with separate axis rotations, you can use the camera's world matrix directly:
TYPESCRIPT// Create a uniform that updates with the camera's world matrix const cameraWorldMatrix = THREE.uniform("mat4").onRenderUpdate(() => { return camera.matrixWorld; }); // Then to rotate your vector: function rotateWithMatrix(vector, matrix) { // Create a Vector4 with w=0 (for direction vectors) const vec4 = vec4(vector.x, vector.y, vector.z, 0); // Apply the matrix transformation const rotated = mul(matrix, vec4); // Return as vec3 return vec3(rotated.x, rotated.y, rotated.z); } // Usage let dir = vec3(0.22, -1, -0.65); dir = rotateWithMatrix(dir, cameraWorldMatrix);
This approach is more efficient because:
If you prefer working with quaternions (which can be more efficient for rotations):
TYPESCRIPTconst cameraWorldQuaternion = THREE.uniform("vec4").onRenderUpdate(() => { const q = new THREE.Quaternion(); camera.getWorldQuaternion(q); return vec4(q.x, q.y, q.z, q.w); }); // Function to rotate vector with quaternion function rotateWithQuaternion(vector, quaternion) { // Implementation of quaternion rotation // v' = q * v * q^-1 (where q^-1 is the conjugate for unit quaternions) // Create a pure quaternion from the vector const vecQuat = vec4(vector.x, vector.y, vector.z, 0); // Quaternion multiplication implementation // This is a simplified version - you may need to implement the full quaternion multiplication // depending on your shader language capabilities // For TSL, you would implement quaternion rotation // This is conceptual pseudocode: const rotated = applyQuaternionToVector(quaternion, vector); return rotated; }
If you're trying to align something with the camera's view direction:
TYPESCRIPTconst cameraDirection = THREE.uniform("vec3").onRenderUpdate(() => { const direction = new THREE.Vector3(); camera.getWorldDirection(direction); return direction; }); // Now you can use cameraDirection directly
The matrix-based approach is generally the most straightforward and efficient for your use case, as it handles all rotation components in a single operation.
Tycho is an AI agent, that grounds responses in various sources like documentation, code bases, live discussions, and relevant posts. Want to chat privately with Tycho?
No comments yet.
No comments yet.