//4 точки прямоугольникаQVector3d vertex0, vertex1, vertex2, vertex3;// Точка целиQVector3d target;// Нормаль к плоскости прямоугольникаQVector3d normal = QVector3D::crossProduct(vertex2 - vertex0, vertex1 - vertex0).normalized();// Центр прямоугольникаQVector3d center = (vertex0 + vertex1 + vertex2 + vertex3) / 4;// Направление из центра прямоугольника на цельQVector3d eye = (target - center).normalized();// Направление вектора "up"// Определяется по линии проходящей через середину "верхнего" ребра и центр прямоугольника// Здесь ребро vertex0-vertex1 приведено для примераQVector3d up = ((vertex0 + vertex1) / 2 - center).normalized();// Итоговая матрица поворота на цельQMatrix4x4 rot;rot.lookAt(eye, center, up);
// Итоговая матрица поворота на цельQMatrix4x4 rot;rot.lookAt(eye, center, up);
C++ (Qt)void Transform(QVector3D p[4], const QVector3D &target){ QVector3D normal = QVector3D::crossProduct(p[2] - p[0], p[1] - p[0]).normalized(); QVector3D center = (p[0] + p[1] + p[2] + p[3]) / 4; QVector3D eye = (target - center).normalized(); double theta = acos(QVector3D::dotProduct(normal, eye)); QMatrix4x4 translateToOrigin; translateToOrigin.translate(-center); QMatrix4x4 lookAtTarget; lookAtTarget.rotate(theta * (180.0 / M_PI), QVector3D::crossProduct(normal, eye)); QMatrix4x4 translateToCenter; translateToCenter.translate(center); QMatrix4x4 t = translateToCenter * lookAtTarget * translateToOrigin; for (uint i = 0; i < 4; i++) { p[i] = t.map(p[i]); }}
C++ (Qt)inline QVector3D operator*(const QMatrix4x4& matrix, const QVector3D& vector){ qreal x, y, z, w;... x = vector.x() * matrix.m[0][0] + vector.y() * matrix.m[1][0] + vector.z() * matrix.m[2][0] + matrix.m[3][0]; y = vector.x() * matrix.m[0][1] + vector.y() * matrix.m[1][1] + vector.z() * matrix.m[2][1] + matrix.m[3][1]; z = vector.x() * matrix.m[0][2] + vector.y() * matrix.m[1][2] + vector.z() * matrix.m[2][2] + matrix.m[3][2];