Вращение 3D моделей с аркболом - PullRequest
0 голосов
/ 14 апреля 2020

Я создаю программное обеспечение с открытым исходным кодом. Я использую манипулятор 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...