three
Version:
JavaScript 3D library
38 lines (27 loc) • 1.19 kB
JavaScript
import { float, vec2, vec3, add, sub, mul, sin, cos, normalize } from '../tsl/TSLBase.js';
export const mx_rotate2d = ( input, amount = 0 ) => {
input = vec2( input );
amount = float( amount );
const rotationRadians = mul( amount, Math.PI / 180.0 );
const sa = sin( rotationRadians );
const ca = cos( rotationRadians );
const x = input.x;
const y = input.y;
return vec2( add( mul( ca, x ), mul( sa, y ) ), sub( mul( ca, y ), mul( sa, x ) ) );
};
export const mx_rotate3d = ( input, amount = 0, axis = vec3( 0, 1, 0 ) ) => {
input = vec3( input );
amount = float( amount );
axis = vec3( axis );
const normalizedAxis = normalize( axis );
const rotationRadians = mul( amount, Math.PI / 180.0 );
const s = sin( rotationRadians );
const c = cos( rotationRadians );
const oc = sub( 1, c );
// based on https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
// but the code in the Wikipedia article is for v' = M * v, where as
// MaterialX is v' = v * M, thus the order of parameters into the first cross are reversed
return input.mul( c )
.add( input.cross( normalizedAxis ).mul( s ) )
.add( normalizedAxis.mul( normalizedAxis.dot( input ).mul( oc ) ) );
};