mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 18:03:56 -04:00
*** empty log message ***
This commit is contained in:
parent
14a82e4f5c
commit
d22e3a3b7e
@ -36,9 +36,9 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
name = 'recorder-%d' % MopathRecorder.count
|
name = 'recorder-%d' % MopathRecorder.count
|
||||||
MopathRecorder.count += 1
|
MopathRecorder.count += 1
|
||||||
optiondefs = (
|
optiondefs = (
|
||||||
('title', self.appname, None),
|
('title', self.appname, None),
|
||||||
('nodePath', direct.camera, None),
|
('nodePath', None, None),
|
||||||
('name', name, None)
|
('name', name, None)
|
||||||
)
|
)
|
||||||
self.defineoptions(kw, optiondefs)
|
self.defineoptions(kw, optiondefs)
|
||||||
|
|
||||||
@ -47,8 +47,8 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
|
|
||||||
self.initialiseoptions(MopathRecorder)
|
self.initialiseoptions(MopathRecorder)
|
||||||
|
|
||||||
self.selectRecordNodePathNamed('init')
|
self.selectRecordNodePathNamed('marker')
|
||||||
self.selectPlaybackNodePathNamed('init')
|
self.selectPlaybackNodePathNamed('marker')
|
||||||
|
|
||||||
def appInit(self):
|
def appInit(self):
|
||||||
self.name = self['name']
|
self.name = self['name']
|
||||||
@ -64,6 +64,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.playbackMarker.reparentTo(self.recorderNodePath)
|
self.playbackMarker.reparentTo(self.recorderNodePath)
|
||||||
self.playbackMarker.hide()
|
self.playbackMarker.hide()
|
||||||
self.playbackMarker.setName('Playback Marker')
|
self.playbackMarker.setName('Playback Marker')
|
||||||
|
# ID of selected object
|
||||||
self.manipulandumId = None
|
self.manipulandumId = None
|
||||||
self.tangentGroup = self.playbackMarker.attachNewNode('Tangent Group')
|
self.tangentGroup = self.playbackMarker.attachNewNode('Tangent Group')
|
||||||
self.tangentGroup.hide()
|
self.tangentGroup.hide()
|
||||||
@ -134,6 +135,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.playbackSF = 1.0
|
self.playbackSF = 1.0
|
||||||
# Sample variables
|
# Sample variables
|
||||||
self.fEven = 0
|
self.fEven = 0
|
||||||
|
self.fForward = 0
|
||||||
self.desampleFrequency = 1
|
self.desampleFrequency = 1
|
||||||
self.numSamples = 100
|
self.numSamples = 100
|
||||||
self.recordStart = 0.0
|
self.recordStart = 0.0
|
||||||
@ -262,7 +264,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
entry_width = 20,
|
entry_width = 20,
|
||||||
selectioncommand = self.selectPlaybackNodePathNamed,
|
selectioncommand = self.selectPlaybackNodePathNamed,
|
||||||
scrolledlist_items = self.pbNodePathNames)
|
scrolledlist_items = self.pbNodePathNames)
|
||||||
self.pbNodePathMenu.selectitem('camera')
|
self.pbNodePathMenu.selectitem('marker')
|
||||||
self.pbNodePathMenuEntry = (
|
self.pbNodePathMenuEntry = (
|
||||||
self.pbNodePathMenu.component('entryfield_entry'))
|
self.pbNodePathMenu.component('entryfield_entry'))
|
||||||
self.pbNodePathMenuBG = (
|
self.pbNodePathMenuBG = (
|
||||||
@ -346,7 +348,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
label_width = 16, label_anchor = W, entry_width = 20,
|
label_width = 16, label_anchor = W, entry_width = 20,
|
||||||
selectioncommand = self.selectRecordNodePathNamed,
|
selectioncommand = self.selectRecordNodePathNamed,
|
||||||
scrolledlist_items = self.recNodePathNames)
|
scrolledlist_items = self.recNodePathNames)
|
||||||
self.recNodePathMenu.selectitem('camera')
|
self.recNodePathMenu.selectitem('marker')
|
||||||
self.recNodePathMenuEntry = (
|
self.recNodePathMenuEntry = (
|
||||||
self.recNodePathMenu.component('entryfield_entry'))
|
self.recNodePathMenu.component('entryfield_entry'))
|
||||||
self.recNodePathMenuBG = (
|
self.recNodePathMenuBG = (
|
||||||
@ -354,6 +356,9 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.bind(self.recNodePathMenu,
|
self.bind(self.recNodePathMenu,
|
||||||
'Select node path to track when recording a new curve')
|
'Select node path to track when recording a new curve')
|
||||||
self.recNodePathMenu.pack(side = LEFT, expand = 0)
|
self.recNodePathMenu.pack(side = LEFT, expand = 0)
|
||||||
|
self.createButton(frame, 'Recording', 'Select',
|
||||||
|
'Select Current Record Node Path',
|
||||||
|
lambda s = self: direct.select(s['nodePath']))
|
||||||
frame.pack(expand = 1, fill = X)
|
frame.pack(expand = 1, fill = X)
|
||||||
|
|
||||||
# Hooks
|
# Hooks
|
||||||
@ -409,10 +414,17 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
side = LEFT)
|
side = LEFT)
|
||||||
widget.component('hull')['relief'] = RIDGE
|
widget.component('hull')['relief'] = RIDGE
|
||||||
widget.onRelease = widget.onReturnRelease = self.sampleCurve
|
widget.onRelease = widget.onReturnRelease = self.sampleCurve
|
||||||
self.createCheckbutton(resampleFrame, 'Resample', 'Even',
|
frame = Frame(resampleFrame)
|
||||||
|
self.createCheckbutton(frame, 'Resample', 'Even',
|
||||||
'On: Resulting path has constant velocity',
|
'On: Resulting path has constant velocity',
|
||||||
self.setEven, self.fEven,
|
self.setEven, self.fEven,
|
||||||
side = LEFT, fill = BOTH, expand = 0)
|
side = TOP, fill = BOTH, expand = 0)
|
||||||
|
self.createCheckbutton(
|
||||||
|
frame, 'Resample', 'Forward',
|
||||||
|
'On: Resulting hpr curve faces along xyz tangent',
|
||||||
|
self.setForward, self.fForward,
|
||||||
|
side = TOP, fill = BOTH, expand = 0)
|
||||||
|
frame.pack(fill = X, expand = 0)
|
||||||
resampleFrame.pack(fill = X, expand = 0, pady = 2)
|
resampleFrame.pack(fill = X, expand = 0, pady = 2)
|
||||||
# Desample
|
# Desample
|
||||||
desampleFrame = Frame(
|
desampleFrame = Frame(
|
||||||
@ -683,13 +695,19 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.xyzNurbsCurveDrawer.draw()
|
self.xyzNurbsCurveDrawer.draw()
|
||||||
# Update tangent
|
# Update tangent
|
||||||
if self.manipulandumId == self.tangentMarker.id():
|
if self.manipulandumId == self.tangentMarker.id():
|
||||||
|
# If manipulating marker, update tangent
|
||||||
# Hide playback marker
|
# Hide playback marker
|
||||||
self.playbackMarker.getChild(0).hide()
|
self.playbackMarker.getChild(0).hide()
|
||||||
# If manipulating marker, update curve
|
# Where is tangent marker relative to playback marker
|
||||||
tan = self.tangentMarker.getPos(self.nodePathParent)
|
tan = self.tangentMarker.getPos()
|
||||||
|
# Transform this vector to curve space
|
||||||
|
tan2Curve = Vec3(
|
||||||
|
self.playbackMarker.getMat(
|
||||||
|
self.nodePathParent).xformVec(tan))
|
||||||
|
# Update nurbs curve
|
||||||
self.xyzNurbsCurve.adjustTangent(
|
self.xyzNurbsCurve.adjustTangent(
|
||||||
self.playbackTime,
|
self.playbackTime,
|
||||||
tan[0], tan[1], tan[2])
|
tan2Curve[0], tan2Curve[1], tan2Curve[2])
|
||||||
self.xyzNurbsCurveDrawer.draw()
|
self.xyzNurbsCurveDrawer.draw()
|
||||||
else:
|
else:
|
||||||
# Show playback marker
|
# Show playback marker
|
||||||
@ -697,6 +715,10 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
# Update tangent marker line
|
# Update tangent marker line
|
||||||
tan = Point3(0)
|
tan = Point3(0)
|
||||||
self.xyzNurbsCurve.getTangent(self.playbackTime, tan)
|
self.xyzNurbsCurve.getTangent(self.playbackTime, tan)
|
||||||
|
# Transform this point to playback marker space
|
||||||
|
tan.assign(
|
||||||
|
self.nodePathParent.getMat(
|
||||||
|
self.playbackMarker).xformVec(tan))
|
||||||
self.tangentMarker.setPos(tan)
|
self.tangentMarker.setPos(tan)
|
||||||
# In either case update tangent line
|
# In either case update tangent line
|
||||||
self.tangentLines.setVertex(1, tan[0], tan[1], tan[2])
|
self.tangentLines.setVertex(1, tan[0], tan[1], tan[2])
|
||||||
@ -1366,12 +1388,30 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
even = self.fEven
|
even = self.fEven
|
||||||
self.xyzCurveFitter.sample(
|
self.xyzCurveFitter.sample(
|
||||||
self.xyzNurbsCurve, self.numSamples, even)
|
self.xyzNurbsCurve, self.numSamples, even)
|
||||||
|
if self.fForward:
|
||||||
|
# Use xyz curve tangent
|
||||||
|
tanPt = Point3(0)
|
||||||
|
lookAtCS = self.playbackMarker.attachNewNode('lookAt')
|
||||||
# Now sample the hprNurbsCurve using the same delta T
|
# Now sample the hprNurbsCurve using the same delta T
|
||||||
for i in range(self.numSamples):
|
for i in range(self.numSamples):
|
||||||
t = self.maxT * (i / float(self.numSamples))
|
t = self.maxT * (i / float(self.numSamples))
|
||||||
hpr = Point3(0)
|
hpr = Point3(0)
|
||||||
self.hprNurbsCurve.getPoint(t, hpr)
|
if self.fForward:
|
||||||
|
# Use xyz curve tangent
|
||||||
|
self.xyzNurbsCurve.getTangent(t, tanPt)
|
||||||
|
# Transform this point to playback marker space
|
||||||
|
tanPt.assign(
|
||||||
|
self.nodePathParent.getMat(
|
||||||
|
self.playbackMarker).xformVec(tanPt))
|
||||||
|
lookAtCS.lookAt(tanPt, Z_AXIS)
|
||||||
|
hpr = lookAtCS.getHpr(self.nodePathParent)
|
||||||
|
else:
|
||||||
|
# Sample existing hpr curve
|
||||||
|
self.hprNurbsCurve.getPoint(t, hpr)
|
||||||
self.hprCurveFitter.addPoint(t, hpr)
|
self.hprCurveFitter.addPoint(t, hpr)
|
||||||
|
# Clean up
|
||||||
|
if self.fForward:
|
||||||
|
lookAtCS.removeNode()
|
||||||
# Now recompute curves
|
# Now recompute curves
|
||||||
self.computeCurves()
|
self.computeCurves()
|
||||||
# Get new point set based on newly created curve
|
# Get new point set based on newly created curve
|
||||||
@ -1385,6 +1425,9 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
def setEven(self):
|
def setEven(self):
|
||||||
self.fEven = self.getVariable('Resample', 'Even').get()
|
self.fEven = self.getVariable('Resample', 'Even').get()
|
||||||
|
|
||||||
|
def setForward(self):
|
||||||
|
self.fForward = self.getVariable('Resample', 'Forward').get()
|
||||||
|
|
||||||
def setPathDuration(self, event):
|
def setPathDuration(self, event):
|
||||||
newMaxT = float(self.getWidget('Resample', 'Path Duration').get())
|
newMaxT = float(self.getWidget('Resample', 'Path Duration').get())
|
||||||
self.setPathDurationTo(newMaxT)
|
self.setPathDurationTo(newMaxT)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user