이 예제에서는 현재 시간을 사용하여 아날로그 시계를 렌더링합니다. vrAEBase에서 파생시켜 VRED의 응용프로그램 루프에 스크립트를 첨부하는 대신, QTimer를 통해 응용프로그램을 계속 업데이트하는 대체 방법을 보여 줍니다. 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()