![]() |
#1
|
|||
|
|||
Using move() and spinTo efficiently
Hello,
I have created a cloud of triangles using startlayer and endlayer in a scene. Now I want to smoothly move the viewpoint within the scene. I do this using move and spinTo. However, the problem now is that when I use move() and spinTo(), the triangles move along with the scene. I want the triangles to remain fixed, which happens when we use mouse to navigate through the view. Can someone help me with this? Kindly find below my code: import viz import struct import vizact import vizinput import random viz.go() import socket #The maximum amount of data to receive at a time MAX_DATA_SIZE = 1024 #The port to send/receive data on PORT = 4999 PORT_SEND = 5000 #Get the name of this computer COMPUTER_NAME = socket.gethostname() #Get the IP address of this computer COMPUTER_IP_ADDRESS = socket.gethostbyname('localhost') #Create a socket to send data over OutSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) OutSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) OutSocket.bind(('',PORT_SEND)) OutSocket.setblocking(0) #Create a socket to receive data from InSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) InSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) InSocket.bind(('', PORT)) InSocket.setblocking(0) #Selection of the scene (Indoor?Outdoor) choice = vizinput.choose('Select an environment',['indoor','outdoor','none']) if choice == 0: sceneIndoor = vizinput.choose('Seect a scene',['court','gallery','maze']) if sceneIndoor == 0: scene = viz.add('court.ive') elif sceneIndoor == 1: scene = viz.add('gallery.osgb') else: scene = viz.add('maze.osgb') elif choice == 1: sceneOutdoor = vizinput.choose('Select a scene',['mountains','beach','forest','open ground']) if sceneOutdoor == 0: scene = viz.addChild('building.obj') elif sceneOutdoor == 1: scene = viz.addChild() elif scene == 2: scene = viz.addChild() elif choice == 2: pass #Create a layer. viz.startLayer(viz.TRIANGLES) viz.vertexColor(1,0,0) viz.vertex(0,0,0) viz.vertexColor(0,1,0) viz.vertex(0.5,1,0) viz.vertexColor(0,0,1) viz.vertex(-0.5,1,0) myTria = viz.endLayer() myTria.setEuler(0,180,0) #def Create_shape(): shapes = [] Number = 5000 for i in range(Number): x = random.randint(-20,20) y = random.randint(-20,20) z = random.randint(-20,20) yaw = random.randint(0,360) pitch = random.randint(0,360) roll = random.randint(0,360) shape = myTria shape.setPosition([x,y,z]) shapes.append(shape) ver1 = shape.getVertex(0) ver2 = shape.getVertex(1) ver3 = shape.getVertex(2) viz.startLayer(viz.TRIANGLES) viz.vertexColor(1,0,0) viz.vertex(ver1) viz.vertexColor(0,1,0) viz.vertex(ver2) viz.vertexColor(0,0,1) viz.vertex(ver3) x = shape.getPosition() myTriangle = viz.endLayer() myTriangle.setPosition(x) myTriangle.setEuler(0,180,0) ## Code for sending data def SendData(data): OutSocket.sendto(data,(COMPUTER_IP_ADDRESS,PORT_SE ND)) ## Code for receiving data def ReceiveData(): try: return InSocket.recv(MAX_DATA_SIZE) except socket.error: #Insert error handling code here pass ## May change as per requirement vizact.onkeydown(' ',SendData,'hello there') def CheckSocket(): #Try to receive data from socket data = ReceiveData() if data: numvalues = (len(data)/ 8) udp = struct.unpack('>'+'d' * numvalues ,data) # Assigning the rotation and translation values yaw = udp[0] pitch = udp[1] roll = udp[2] moveSpeed = udp[3] xPos = udp[4] yPos = udp[5] zPos = udp[6] if ((yaw == 1) and (pitch == 1) and (roll == 1) and (moveSpeed == 1) and (xPos == 1) and (yPos == 1) and (zPos == 1)): initPos = vizact.spinTo(euler=[0,0,0], speed = moveSpeed) scene.addAction(initPos) else: index = random.randint(0,1) if index == 0: rotation = vizact.spinTo(euler=[yaw,pitch,roll], time = moveSpeed) scene.addAction(rotation) else: rotation = vizact.spinTo(euler=[-yaw,-pitch,-roll], time = moveSpeed) scene.addAction(rotation) rotTime = 0; if xPos != 0: rotTime = xPos / moveSpeed elif yPos !=0: rotTime = yPos / moveSpeed elif zPos !=0: rotTime = zPos / moveSpeed # Check condition to execute translation if rotTime != 0: translation = vizact.move([xPos,yPos,zPos],rotTime) scene.addAction(translation) print udp vizact.ontimer(0,CheckSocket) Thanks in advance. Kind Regards, Shweta. |
#2
|
|||
|
|||
Please see the guidelines for posting Vizard code. This will make it easier for other users to help with your code.
|
#3
|
|||
|
|||
Reposting the code :
Code:
import viz import struct import vizact import vizinput import random viz.go() import socket #The maximum amount of data to receive at a time MAX_DATA_SIZE = 1024 #The port to send/receive data on PORT = 4999 PORT_SEND = 5000 #Get the name of this computer COMPUTER_NAME = socket.gethostname() #Get the IP address of this computer COMPUTER_IP_ADDRESS = socket.gethostbyname('localhost') #Create a socket to send data over OutSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) OutSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) OutSocket.bind(('',PORT_SEND)) OutSocket.setblocking(0) #Create a socket to receive data from InSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) InSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) InSocket.bind(('', PORT)) InSocket.setblocking(0) #Selection of the scene (Indoor?Outdoor) choice = vizinput.choose('Select an environment',['indoor','outdoor','none']) if choice == 0: sceneIndoor = vizinput.choose('Seect a scene',['court','gallery','maze']) if sceneIndoor == 0: scene = viz.add('court.ive') elif sceneIndoor == 1: scene = viz.add('gallery.osgb') else: scene = viz.add('maze.osgb') elif choice == 1: sceneOutdoor = vizinput.choose('Select a scene',['mountains','beach','forest','open ground']) if sceneOutdoor == 0: scene = viz.addChild('building.obj') elif sceneOutdoor == 1: scene = viz.addChild() elif scene == 2: scene = viz.addChild() elif choice == 2: pass #Create a layer. viz.startLayer(viz.TRIANGLES) viz.vertexColor(1,0,0) viz.vertex(0,0,0) viz.vertexColor(0,1,0) viz.vertex(0.5,1,0) viz.vertexColor(0,0,1) viz.vertex(-0.5,1,0) myTria = viz.endLayer() myTria.setEuler(0,180,0) #def Create_shape(): shapes = [] Number = 5000 for i in range(Number): x = random.randint(-20,20) y = random.randint(-20,20) z = random.randint(-20,20) yaw = random.randint(0,360) pitch = random.randint(0,360) roll = random.randint(0,360) shape = myTria shape.setPosition([x,y,z]) shapes.append(shape) ver1 = shape.getVertex(0) ver2 = shape.getVertex(1) ver3 = shape.getVertex(2) viz.startLayer(viz.TRIANGLES) viz.vertexColor(1,0,0) viz.vertex(ver1) viz.vertexColor(0,1,0) viz.vertex(ver2) viz.vertexColor(0,0,1) viz.vertex(ver3) x = shape.getPosition() myTriangle = viz.endLayer() myTriangle.setPosition(x) myTriangle.setEuler(0,180,0) ## Code for sending data def SendData(data): OutSocket.sendto(data,(COMPUTER_IP_ADDRESS,PORT_SE ND)) ## Code for receiving data def ReceiveData(): try: return InSocket.recv(MAX_DATA_SIZE) except socket.error: #Insert error handling code here pass ## May change as per requirement vizact.onkeydown(' ',SendData,'hello there') def CheckSocket(): #Try to receive data from socket data = ReceiveData() if data: numvalues = (len(data)/ 8) udp = struct.unpack('>'+'d' * numvalues ,data) # Assigning the rotation and translation values yaw = udp[0] pitch = udp[1] roll = udp[2] moveSpeed = udp[3] xPos = udp[4] yPos = udp[5] zPos = udp[6] if ((yaw == 1) and (pitch == 1) and (roll == 1) and (moveSpeed == 1) and (xPos == 1) and (yPos == 1) and (zPos == 1)): initPos = vizact.spinTo(euler=[0,0,0], speed = moveSpeed) scene.addAction(initPos) else: index = random.randint(0,1) if index == 0: rotation = vizact.spinTo(euler=[yaw,pitch,roll], time = moveSpeed) scene.addAction(rotation) else: rotation = vizact.spinTo(euler=[-yaw,-pitch,-roll], time = moveSpeed) scene.addAction(rotation) rotTime = 0; if xPos != 0: rotTime = xPos / moveSpeed elif yPos !=0: rotTime = yPos / moveSpeed elif zPos !=0: rotTime = zPos / moveSpeed # Check condition to execute translation if rotTime != 0: translation = vizact.move([xPos,yPos,zPos],rotTime) scene.addAction(translation) print udp vizact.ontimer(0,CheckSocket) |
#4
|
|||
|
|||
It's not possible to copy/paste your code and run it. The indentation has been lost and it seems the example could be simplified. Try and minimize the code so that it can be run directly without requiring a network connection. You might need to store the data in some lists to simulate what's received via the network.
|
![]() |
Thread Tools | |
Display Modes | Rate This Thread |
|
|