// Pure mathematical conventions, not automatic game memory adapters.
namespace easy_coordinates {
bool basis_degrees(float pitch,float yaw,float roll,vec3 &out forward,vec3 &out right,vec3 &out up) {
forward=vec3();right=vec3();up=vec3();
if(!math::is_finite(pitch)||!math::is_finite(yaw)||!math::is_finite(roll)
||math::abs(pitch)>36000||math::abs(yaw)>36000||math::abs(roll)>36000) return false;
float p=pitch*0.01745329252f,y=yaw*0.01745329252f,r=roll*0.01745329252f;
float cp=math::cos(p),sp=math::sin(p),cy=math::cos(y),sy=math::sin(y),cr=math::cos(r),sr=math::sin(r);
forward=vec3(cp*cy,cp*sy,sp);
vec3 base_right(-sy,cy,0),base_up(-sp*cy,-sp*sy,cp);
right=base_right.multiply(cr).add(base_up.multiply(sr));
up=base_up.multiply(cr).subtract(base_right.multiply(sr));
return true;
}
bool source_style_basis(float pitch,float yaw,float roll,vec3 &out forward,vec3 &out right,vec3 &out up) {
return basis_degrees(-pitch,yaw,roll,forward,right,up);
}
bool quaternion_rotate(const vec3 &in point,float x,float y,float z,float w,vec3 &out result) {
result=vec3();
if(!math::is_finite(point.x)||!math::is_finite(point.y)||!math::is_finite(point.z)
||math::abs(point.x)>10000000||math::abs(point.y)>10000000||math::abs(point.z)>10000000)return false;
if(!math::is_finite(x)||!math::is_finite(y)||!math::is_finite(z)||!math::is_finite(w))return false;
float length=math::sqrt(x*x+y*y+z*z+w*w);
if(!math::is_finite(length)||length<0.000001f)return false;
vec3 q(x/length,y/length,z/length);w/=length;
vec3 twice=q.cross(point).multiply(2);
result=point.add(twice.multiply(w)).add(q.cross(twice));return true;
}
}
Easy Universal / Примеры и шаблоны