Я создаю программное обеспечение с открытым исходным кодом. Я использую манипулятор arcball для преобразования матрицы вида или матрицы модели. На матрице просмотра все работает нормально.
// code to map the mouse_position onto the sphere in the center off the screen
private vec3 MapToSphere(int mx, int my)
{
var x = (1.0f * mx / Width * 2f) -1f;
var y = (1.0f * my / Height * 2f) -1f;
var p = new vec3(x, -y, 0.0f);
float OP_squared = p.x * p.x + p.y * p.y;
if (OP_squared <= 1 * 1)
p.z = math.sqrt(1.0f * 1.0f) - OP_squared; // Pythagoras
else
p = vec3.normalize(p); // nearest point
return p;
}
Использование:
public mat4 Rotate(
int curr_mx, int curr_my,
int last_mx, int last_my,
mat4 viewMat = new mat4())
{
var va = vec3.normalize(MapToSphere(last_mx, last_my));
var vb = vec3.normalize(MapToSphere(curr_mx, curr_my));
vec3 axis = vec3.cross(va, vb);
float angle = math.acos(vec3.dot(va, vb));
var rotmat = mat4.identity;
if(viewMat != mat4.zero)
{
var inv = mat4.invert(viewMat);
axis = vec3.transformVector(axis, ref inv);
}
if (axis != vec3.zero && angle > float.Epsilon)
rotmat = mat4.rotate(axis, angle);
return rotmat;
}
При переводе объекта в другое место результаты неверны, поскольку сфера арбалета отображается на мировой центр , Как я могу реорганизовать свою функцию так, чтобы она отображалась в центре модели.
Приложил GIF текущей ситуации https://imgur.com/VfF4s98