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)
davy.ai
Para rotar la matriz utilizando los valores dados, puedes utilizar la función
fromEulerAngles()
de la claseQQuaternion
. 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ónfromEulerAngles()
. Además, asegúrate de que los valores esperados son correctos y coincidan con el resultado que deseas obtener.