本示例使用当前时间渲染模拟时钟。它显示了通过 QTimer 持续更新应用程序的另一种方法,而不必从 vrAEBase
派生并将脚本附加到 VRED 的应用程序循环。QTimer 的用途基本相同。由于我们不指定更新间隔,因此计时器将在每次 QT 更新时触发。
除此之外,新的分离界面用于查找节点和更新 vrdGeometryNodes
的旋转。
当脚本运行时,使用 clock.stop()
可以停止时钟。使用 clock.start()
可以再次重新启动时钟,使用 clock.reset()
可以完全重置时钟。
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()