Vertex/Vertices Movment..

Blitz3D Forums/Blitz3D Programming/Vertex/Vertices Movment..

Spy(Posted 2003) [#1]
hi..

i've been trying to find here and on blitzcoder some explanations or exampels on how to get a vertex or a group of vertecies from an mesh and then manipulate it.. ie. move it around but found none..

can anyone point me to some examples ?

tnx


orion one(Posted 2003) [#2]
hi, i am no b3d pro but i see that your post has been on the forum for several days without recieveing any answer, so here am i.

the philosphy of what you want to do is the following :
. a mesh is a collection of surfaces (one or more)
. a surface is a collection of vertices (one or more)
(. triangles are made of (3) vertices)

so if you want to manipulate vertices, you have to go from the bigger structure to the smaller, that is from the mesh to the vertex :

. mesh=loadmesh() or createmesh() or any mesh
. surface=getsurface(mesh, index of the surface)
. vertex-coord-X=vertexx(surface, index of the vertex)
. idem for Y and Z coordinates

then change those X Y and Z values as you wish :
. vertexcoords surface,index of vertex,X,Y,Z

you will have to adapt the XYZ values of every vertex you want to change ...

but if you change the XYZ coords of a vertex that is part of several triangles, all the triangles will deform.

hoping to be of some help

orion one
.


shawnus(Posted 2003) [#3]
orion one,

I have a problem that sounds up your street- I would like to get a heart mesh to beat realistically ie. atria then ventricles. I would also like to simulate things like af, brady & tachy, vt, st elevation/depression etc. Is this possible? would it be possible to use the signal from a 12 lead ecg to drive the mesh? I am developing educational software for the cardiac catheterisation labs.

Cheers Shawnus


_Skully(Posted 2003) [#4]
try this:

Graphics3D 1024,768,32

SetBuffer BackBuffer()
WireFrame True

camera=CreateCamera()
PositionEntity camera,0,10,-10

ship=LoadMesh("models\fighter.3ds")
ScaleMesh ship,0.03,0.03,0.03
PointEntity camera,ship

light=CreateLight()

angle#=0
alpha#=1.0

Type vertex
	Field s			; surface
	Field index
	Field x#
	Field y#
	Field z#
End Type

Global maxx#,maxy#,maxz#,minx#,miny#,minz#
Global rangex#,rangey#,rangez#

GetModel(ship)
rangex=maxx-minx
rangey=maxy-miny
rangez=maxz-minz
UpdateNormals ship

While Not KeyDown(1)

	RenderWorld
	Text 0,0,"Press C to cloak"
	
	TurnEntity ship,0,0.1,0
	
	If KeyHit( 46 )=True cloak=1-cloak

	If cloak=1 And MilliSecs()>timer
		angle=angle+12
		timer=MilliSecs()+20
		alpha=alpha*0.95
		If alpha<0.0009 Then alpha=1.0:cloak=False
		setalpha(ship,alpha)
		vc=0
		For v.vertex=Each vertex
			vc=vc+1
			perx#=((maxx-v\x)+minx)*48.0
			pery#=((maxy-v\y)+miny)*48.0
			perz#=((maxz-v\z)+minz)*48.0
			VertexCoords v\s,v\index,v\x+(Sin(angle+perx)/4.0),v\y+(Cos(angle+pery)/4.0),v\z+(Cos(angle+perz)/4.0)
		Next
		UpdateNormals ship
	EndIf
	Flip
Wend
End

Function setalpha(ship,alpha#)
	cc=CountChildren(ship)
	If cc=0
		EntityAlpha ship,alpha
	Else
		For count=0 To cc-1
			gc=GetChild(ship,count)
			setalpha(gc,alpha)
		Next
	EndIf
End Function

Function GetModel(ship)
		For sur=1 To CountSurfaces(ship)
			; get all the surfaces
			surface=GetSurface(ship,sur)
			; get the vertices for each surface
			For vertex=0 To CountVertices(surface)-1
				v.vertex=New vertex
				v\s=surface
				v\index=vertex
				v\x=VertexX(surface,vertex)
				v\y=VertexY(surface,vertex)
				v\z=VertexZ(surface,vertex)

				; get the limits of the model
				If v\x>maxx# Then maxx=v\x
				If v\x<minx# Then minx=v\x
				If v\y>maxy# Then maxy=v\y
				If v\y<miny# Then miny=v\y
				If v\z>maxz# Then maxz=v\z
				If v\z<minz# Then minz=v\z
			Next
		Next
End Function

You may have to adjust the scale of whatever model you decide to punch into this




shawnus(Posted 2003) [#5]
thanks _skully- i will try it
shawnus


shawnus(Posted 2003) [#6]
_skully

sorry for the wait for my reply- it works wonderfully.
thanks.

shawnus