diff options
Diffstat (limited to 'Studio/Content/Behavior Library/CameraLookAt.qml')
-rw-r--r-- | Studio/Content/Behavior Library/CameraLookAt.qml | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/Studio/Content/Behavior Library/CameraLookAt.qml b/Studio/Content/Behavior Library/CameraLookAt.qml new file mode 100644 index 0000000..a4d0c9d --- /dev/null +++ b/Studio/Content/Behavior Library/CameraLookAt.qml @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt 3D Studio. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*[[ + <Property name="cameraTarget" formalName="Camera Target" type="ObjectRef" default="Scene.Layer.Camera" description="Object in scene the camera should look at" /> + <Property name="startImmediately" formalName="Start Immediately?" type="Boolean" default="True" publishLevel="Advanced" description="Start immediately, or wait for\nthe Enable action to be called?" /> + + <Handler name="start" formalName="Start" category="CameraLookAt" description="Begin looking the target" /> + <Handler name="stop" formalName="Stop" category="CameraLookAt" description="Stop looking the target" /> +]]*/ + +import QtStudio3D.Behavior 1.0 + +Behavior { + //External: + property string cameraTarget + property bool startImmediately + //Internal: + property bool running: false + property var updateFunction + + function start() { + running = true; + } + + function stop() { + running = false; + } + + onInitialize: { + if (startImmediately) + start(); + } + + onUpdate: { + if (!running) + return; + var targetTransform = calculateGlobalTransform(cameraTarget); + var targetSpot = targetTransform.row(3).toVector3d(); + var cameraTransform = calculateGlobalTransform(); + var cameraSpot = cameraTransform.row(3).toVector3d(); + + var matrix = calculateGlobalTransform("parent").inverted(); + matrix.m41 = 0; + matrix.m42 = 0; + matrix.m43 = 0; + + var rotateRay = targetSpot + .minus(cameraSpot) + .times(matrix); + + var rotation = lookAt(rotateRay); + setAttributeVector("rotation", rotation); + } + + function getAttributeVector(name) { + var vec = Qt.vector3d(0, 0, 0); + getAttribute(name + ".x", vec.x); + getAttribute(name + ".y", vec.y); + getAttribute(name + ".z", vec.z); + return vec; + } + + function setAttributeVector(name, vec) { + setAttribute(name + ".x", vec.x); + setAttribute(name + ".y", vec.y); + setAttribute(name + ".z", vec.z); + } +} |