EasyUniversal / DocsДокументация · SDK 0.3Подписка Universal ↗
Easy Universal / Helper-модули

helpers/coordinates.as

AngelScript · native runtime · локальная сборка
// 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 — отдельный проект. Easy External не изменён.