![]() |
|
#1
|
|||
|
|||
|
Tractor beam module to inspect objects
Hacked a little code that moves selected objects close to the view, then puts them back.
To try, run the module, press and hold the spacebar, move the ball to an object, release the spacebar. Enjoy ![]() Code:
import viz
import vizmat
import viztask
import vizact
TRACTOR_TIME = 4
tractorNodes = []
def init(trackerNodeList):
global startProjectSignal, tractorNodes
tractorNodes = trackerNodeList
startProjectSignal = viztask.Signal()
viztask.schedule(think())
def startProject():
global isProjectionDone
startProjectSignal.send()
def stopProject():
global isProjectionDone
isProjectionDone = True
def think():
global isProjectionDone
cursor = viz.add('white_ball.wrl')
cursor.color(viz.GREEN)
cursor.alpha(.5)
cursor.visible(viz.OFF)
viz.startLayer(viz.LINES)
viz.vertex([0,0,0])
viz.vertex([0,0,0])
lazer = viz.endLayer()
lazer.color(viz.GREEN)
lazer.visible(viz.OFF)
while True:
# print 'wait'
yield startProjectSignal.wait()
print 'start tractor'
isProjectionDone = False
cursor.visible(viz.ON)
lazer.visible(viz.ON)
hitObject = None
while not isProjectionDone:
line = viz.MainWindow.screenToWorld([.5, .5])
line.length = 100
lazerStart = line.begin
lazerStart[1] -= .1
lazer.setVertex(0, lazerStart)
lazer.setVertex(1, line.end)
intersectObj = viz.phys.intersectLine(line.begin, line.end)
if intersectObj.valid:
cursor.setPosition(intersectObj.point)
if intersectObj.object in tractorNodes:
hitObject = intersectObj.object
else:
hitObject = None
yield None
# print 'done'
cursor.visible(viz.OFF)
lazer.visible(viz.OFF)
if hitObject:
#start Tractor
isProjectionDone = False
startTime = viz.tick()
startPos = hitObject.getPosition(viz.ABS_GLOBAL)
bb = hitObject.getBoundingBox(viz.ABS_GLOBAL)
distanceFromView = max(bb.width, bb.height, bb.depth) * 2
centerOffset = vizmat.Vector(startPos)- vizmat.Vector(bb.center)
while not isProjectionDone:
percentageToGo = (viz.tick()-startTime) / TRACTOR_TIME
if percentageToGo > 1.0:
isProjectionDone = True
break
line = viz.MainWindow.screenToWorld([.5, .5])
line.length = distanceFromView
targetPos = line.end + centerOffset
pos = vizmat.Interpolate(hitObject.getPosition(viz.ABS_GLOBAL), targetPos, percentageToGo)
hitObject.setPosition(pos, viz.ABS_GLOBAL)
yield None
hitObject.runAction( vizact.moveTo(startPos, time=TRACTOR_TIME*.2) )
if __name__ == "__main__":
viz.go()
viz.phys.enable()
room = viz.add('gallery.osgb')
room.collideMesh()
list = []
for i in range(5):
b = viz.add('box.wrl', pos=[i*.5, 1.5, 2], scale=[.3]*3)
b.collideMesh()
list.append(b)
h = viz.add('tut_hedra.wrl', pos=[-1, 1, 4])
h.collideMesh()
list.append( h )
h = viz.add('vcc_female.cfg', pos=[-2, 1, 4])
h.collideMesh()
list.append( h )
h = viz.add('ball.wrl', pos=[-2, 1, 4])
h.collideMesh()
list.append( h )
init(list)
vizact.onkeydown(' ', startProject)
vizact.onkeyup(' ', stopProject)
__________________
Paul Elliott WorldViz LLC |
![]() |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Exception in module vizjoy | fordprefect | Vizard | 2 | 12-03-2012 01:41 AM |
| Trouble picking text3d objects | Salvar | Vizard | 4 | 12-01-2010 03:07 PM |
| static or dynamic objects | shahramy | Vizard | 2 | 11-10-2010 12:32 AM |
| Semi-circle array containing target and distractor objects | ptjt255 | Vizard | 3 | 08-04-2009 03:09 AM |
| Could not find plugin to load objects... | halley | Vizard | 1 | 05-30-2006 11:01 AM |