float dot(vec2 v0, vec2 v1) { v0.x * v1.x + v0.y * v1.y; // 2 умножения, 1 сложение }
float dot(vec3 v0, vec3 v1) { v0.x * v1.x + v0.y * v1.y + v0.z*v1.z; // 2 умножения, 1 сложение }

Равен произведению длин векторов на косинус угла между ними:
dot(a,b) = |a||b|cos(angle_rad)

    Скалярное произведение > 0, если вектора направлены в одну сторону, 0 — если вектора перпендикулярны и < 0, если направлены противоположно.


Является длиной проекции произвольного вектора на нормализованный вектор:
proj_length = dot(a, normal)

Скалярное произведение самого на себя является квадратом длины вектора:
dot(a,a) == length2(a)

Получить вектор-проекцию можно так:
proj_point = b*dot(a,b)/dot(b,b)

------------!= znachit not equal !
cross(a,b) != cross(b,a)  
vec3 cross(const vec3 &v0, const vec3 &v1)
{
    vec3 ret;
    ret.x = v0.y * v1.z - v0.z * v1.y;
    ret.y = v0.z * v1.x - v0.x * v1.z;
    ret.z = v0.x * v1.y - v0.y * v1.x;
    return ret; // 6 умножений, 3 вычитания
}
---
float Cross( Vec2 a,  Vec2 b) { return a.x * b.y - a.y * b.x; } вернет float число
---mat3x3
setDir(vec3 dir,vec3 up,int axis){
	vec3 x,y,z=norm(dir);
	//Y-forward Z-up
	norm(cross(x,y,up));
	norm(cross(z,x,y));
	mat3 rotation(x,y,z);
	
}
----
Чтобы идти в доль стены надо.
dir = вектор(vec3) движения персонажа
normal = нормаль поверхности стены.
vec3 tmp = cross(dir,normal);//можно без Y только dir.xz,normal.xz
vec3 new = cross(tmp,normal);
----
Помните задачу нахождения отраженного вектора? Зная ее, можно легко то же самое сделать
 через dot (еще и быстрее будет работать!):
vec3 new_dir = dir - 2 * dot(dir, normal) * normal;
--
Naiti normal. vec3 a,b,c as point one triangle
vec3 normal = normalize(cross(c-a,b-a))

Тоже самое:
vec3 GetTriangleNormal(vec3 a, vec3 b, vec3 c) {
    vec3 edge1 = b-a;
    vec3 edge2 = c-a;
    vec3 normal = cross(edge1,edge2);
    return normal;
}

vec2 rotate(vec2 point, float angle){
        vec2 rotated_point;
        rotated_point.x = point.x * cos(angle) - point.y * sin(angle);
        rotated_point.y = point.x * sin(angle) + point.y * cos(angle);
        return rotated_point;
}