es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo transformar QMatrix4x4 con escalado, posición y ángulos para encontrar los vértices del cuboide?

Tengo la posición del centro, los valores de escala (l, w, h) y el ángulo de orientación en grados.
Deseo rotar la matriz utilizando estos valores. Tengo el siguiente código para transformar la matriz.
Tengo una duda sobre la parte de los ángulos. ¿Cómo paso estos valores a la matriz? Hasta ahora los he pasado como Quartenion, pero no estaba seguro al respecto. Estos valores están en grados.

QMatrix4x4 matrix;
qInfo () << matrix;

float Cuboid_centre_x = -26.6619, Cuboid_centre_y = -36.2277 , Cuboid_centre_z = -0.26431;

// Ángulos alrededor de x, y, z
float ax = 0, ay = 0, az = 0;

// Factor de escala para x, y y z (largo, ancho, alto)
float sx =  3.79948, sy = 1.44547, sz = 1.05955;

// Posición de traslación
matrix.translate(Cuboid_centre_x, Cuboid_centre_y, Cuboid_centre_z);
qInfo () << matrix;

// Rotar por los ángulos
QQuaternion q = Qt3DCore::QTransform::fromEulerAngles(ax, ay, az);
matrix.rotate(q);
qInfo () << matrix;

// Escalar por dimensiones
matrix.scale(sx, sy, sz);
qInfo () << matrix;

QVector3D corners[8];

for (int i = 0; i < 8; i++) {
    int x = i % 2 * 2 - 1;
    int y = i / 2 % 2 * 2 - 1;
    int z = i / 4 % 2 * 2 - 1;
    corners[i] = matrix.map(QVector3D(x, y, z));
    qInfo () << corners[i];
}

Por favor, sugiérame. Los valores que he impreso no coinciden con mi salida.

Espero que los valores sean aproximadamente

QVector3D(-28.561613082885743, -36.95038986206055, -0.26546499133110049) 
QVector3D(-24.76213264465332, -36.95038986206055, -0.26546499133110049)
QVector3D(-28.561613082885743, -36.95038986206055, 0.7940845489501953) 
QVector3D(-24.76213264465332, -36.95038986206055, 0.7940845489501953)
QVector3D(-28.561613082885743, -35.50492477416992, -0.26546499133110049)
QVector3D(-24.76213264465332, -35.50492477416992, -0.26546499133110049)
QVector3D(-28.561613082885743, -35.50492477416992, 0.7940845489501953)
QVector3D(-24.76213264465332, -35.50492477416992, -0.26546499133110049)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para rotar la matriz utilizando los valores dados, puedes utilizar la función fromEulerAngles() de la clase QQuaternion. Los ángulos deben convertirse de grados a radianes antes de pasarlos a la función. Aquí está el código actualizado:

    “`c++
    QMatrix4x4 matrix;
    qInfo() << matrix;

    float Cuboid_centre_x = -26.6619, Cuboid_centre_y = -36.2277 , Cuboid_centre_z = -0.26431;

    // Ángulos alrededor de x, y, z en grados
    float ax = 45, ay = 30, az = 60;

    // Factor de escala para x, y y z (longitud, anchura, altura)
    float sx = 3.79948, sy = 1.44547, sz = 1.05955;

    // Traducir posición
    matrix.translate(Cuboid_centre_x, Cuboid_centre_y, Cuboid_centre_z);
    qInfo() << matrix;

    // Rotar por ángulos
    float rx = qDegreesToRadians(ax);
    float ry = qDegreesToRadians(ay);
    float rz = qDegreesToRadians(az);
    QQuaternion q = QQuaternion::fromEulerAngles(rx, ry, rz);
    matrix.rotate(q);
    qInfo() << matrix;

    // Escalar por dimensiones
    matrix.scale(sx, sy, sz);
    qInfo() << matrix;

    QVector3D corners[8];

    for (int i = 0; i < 8; i++) {
    int x = i % 2 * 2 – 1;
    int y = i / 2 % 2 * 2 – 1;
    int z = i / 4 % 2 * 2 – 1;
    corners[i] = matrix.map(QVector3D(x,y,z));
    qInfo() << corners[i];
    }
    “`

    Ten en cuenta que la función qDegreesToRadians() se utiliza para convertir los valores de ángulo de grados a radianes antes de pasarlos a la función fromEulerAngles(). Además, asegúrate de que los valores esperados son correctos y coincidan con el resultado que deseas obtener.

Comments are closed.