Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
lookatnode.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "lookatnode_p.h"
5
6#include <QtMath>
7
62
66
68{
69 return m_target;
70}
71
73{
74 if (node == m_target)
75 return;
76
77 if (m_target) {
78 disconnect(m_target, &QQuick3DNode::scenePositionChanged, this, &LookAtNode::updateLookAt);
79 disconnect(this, &QQuick3DNode::scenePositionChanged, this, &LookAtNode::updateLookAt);
80 }
81
82 m_target = node;
83
84 if (m_target) {
85 connect(m_target, &QQuick3DNode::scenePositionChanged, this, &LookAtNode::updateLookAt);
86 connect(this, &QQuick3DNode::scenePositionChanged, this, &LookAtNode::updateLookAt);
87 }
88
90 updateLookAt();
91}
92
93void LookAtNode::updateLookAt()
94{
95 if (m_target) {
96 // Note: This code was originally copied from QQuick3DCamera::lookAt method.
97
98 // Assumption: we never want the node to roll.
99 // We use Euler angles here to avoid roll to sneak in through numerical instability.
100
101 const QVector3D targetPosition = m_target->scenePosition();
102 auto sourcePosition = scenePosition();
103
104 QVector3D targetVector = sourcePosition - targetPosition;
105
106 float yaw = qRadiansToDegrees(atan2(targetVector.x(), targetVector.z()));
107
108 QVector2D p(targetVector.x(), targetVector.z()); // yaw vector projected to horizontal plane
109 float pitch = qRadiansToDegrees(atan2(p.length(), targetVector.y())) - 90;
110
111 const float previousRoll = eulerRotation().z();
112 setEulerRotation(QVector3D(pitch, yaw, previousRoll));
113 }
114}
void setTarget(QQuick3DNode *node)
LookAtNode()
\qmltype LookAtNode \inqmlmodule QtQuick3D.Helpers \inherits Node
~LookAtNode() override
QQuick3DNode * target
void targetChanged()
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
QVector3D scenePosition
void setEulerRotation(const QVector3D &eulerRotation)
void scenePositionChanged()
QVector3D eulerRotation
The QVector2D class represents a vector or vertex in 2D space.
Definition qvectornd.h:31
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
constexpr float z() const noexcept
Returns the z coordinate of this point.
Definition qvectornd.h:672
constexpr float qRadiansToDegrees(float radians)
Definition qmath.h:281
GLfloat GLfloat p
[1]
#define emit
myObject disconnect()
[26]