模拟时钟示例

本示例使用当前时间渲染模拟时钟。它显示了通过 QTimer 持续更新应用程序的另一种方法,而不必从 vrAEBase 派生并将脚本附加到 VRED 的应用程序循环。QTimer 的用途基本相同。由于我们不指定更新间隔,因此计时器将在每次 QT 更新时触发。

除此之外,新的分离界面用于查找节点和更新 vrdGeometryNodes 的旋转。

当脚本运行时,使用 clock.stop() 可以停止时钟。使用 clock.start() 可以再次重新启动时钟,使用 clock.reset() 可以完全重置时钟。

analog_clock.py


print("Executing analog clock script!")

newScene()
loadGeometry("$VRED_EXAMPLES/geo/analog_clock.osb")
updateScene()

import math
from datetime import datetime
from PySide2.QtCore import QTimer
from PySide2.QtGui import QVector3D

# Deactivate clock: clock.stop()
# Reactivate clock: clock.start()
# Stop-Delete-Reset clock: clock.reset()


class clockWork():

    def __init__(self):
        self.needle_hours = vrNodeService.findNode("Clock_Needle_Hours")
        self.needle_minutes = vrNodeService.findNode("Clock_Needle_Minutes")
        self.needle_seconds = vrNodeService.findNode("Clock_Needle_Seconds")
        self.timer = QTimer();
        self.timer.timeout.connect(self.updateClock)

    def start(self):
        if self.timer.isActive():
            return
        self.timer.start()
        vrLogInfo('Clock activated')

    def stop(self):
        self.timer.stop()
        vrLogInfo('Stopping clock.')

    def reset(self):
        self.stop()
        self.needle_hours.setRotationAsEuler(QVector3D(0,0,0))
        self.needle_minutes.setRotationAsEuler(QVector3D(0,0,0))
        self.needle_seconds.setRotationAsEuler(QVector3D(0,0,0))
        vrLogInfo('Resetting clock.')              

    def getAngle(self, arg):
        return (arg / 60) * 360

    def getAngleHour(self, hour, minute):
        return (hour * 30) + (minute / 60) * 30

    def updateClock(self):
        now = datetime.now()

        seconds_angle = self.getAngle(now.second)
        minutes_angle = self.getAngle(now.minute)
        hours_angle = self.getAngleHour(now.hour, now.minute)    

        self.needle_seconds.setRotationAsEuler(QVector3D(0, 0, -seconds_angle))
        self.needle_minutes.setRotationAsEuler(QVector3D(0, 0, -minutes_angle))
        self.needle_hours.setRotationAsEuler(QVector3D(0, 0, -hours_angle))


clock = clockWork()
clock.start()