Показать сообщение отдельно
Старый 16.08.2011, 00:05   #30
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Организация системы частиц

Вообще у тебя есть вектор соединяющий камеру и точку квада. Значит есть плоскость перпендикулярная камере, в которой должен лежать твой квад. Находишь два единичных перпендикулярных вектора.

Условие перпендикулярности векторов (x1*x2+y1*y2+z1*z2)=0
Третий вектор перпендикулярный двум данным получается векторным умножением. И вот у тебя есть точка и два вектора. Позиции четырех вершин. 0 - у меня это была опорная точка, через которую проводились все манипуляции с квадом, как его перемещение, масштабирование и вращение. 1 - 0+первый вектор, 2-0+второй вектор, 3-0 плюс вектор1+вектор 2. Профит. Поворот тоже несложен. Если мыслить правильно и векторами, а не тригонометрией Потому как расчитать длину второго катета, шоб гипотенуза повернулась на угол от первого катета несложно, а направляющие векторы катетов у тебя есть

Результат моих попыток квадов, вроде даже работает почти Тут я правда синусами делал Этот прием называется поворот осей координат.
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
SeedRnd=MilliSecs()
Dither 0

Global pivot,camera,mxs#,mys#,Light,timer3
Dim quadsys#(1,1)

pivot=CreatePivot()
PositionEntity pivot,0,3,-10
camera=CreateCamera(pivot)
CameraClsColor camera,0,75,151
light=CreateLight()
MeshLight=CreateSphere(6,light)
ScaleMesh meshlight,2.3,2.3,2.3
EntityFX meshlight,1
AmbientLight 15,15,15
mz=CreateQuadSystem(600)
FillArray(mz)


While Not ((KeyDown(56) And KeyHit(62)) Or  (KeyHit(56) And KeyDown(62))  Or KeyHit(1))
timer3=MilliSecs()
PointEntity light,camera
PositionEntity light,125*Sin(MilliSecs()/30),125,125*Cos(MilliSecs()/30)


QuadroFlipper(camera,mz)
updatearray(mz)


UpdateWorld
RenderWorld
control(0.5,1.4)
Flip 0
Wend
End

Function UpdateArray(quadsystem)

mesh=quadsystem
meshsurf=GetSurface(mesh,1)
qverts=CountVertices(meshsurf)/4

For i=0 To qverts-1
quadsys#(i,1)=quadsys#(i,1)-0.2
quadsys#(I,5)=MilliSecs()/10+i
If quadsys#(i,1)<0 Then 
quadsys#(i,0)=Rnd(-60,60)	;	x position
quadsys#(i,1)=120									;	y position
quadsys#(i,2)=Rnd(-60,60)	;	z position

EndIf
Next
End Function

Function FillArray(quadsystem)
mesh=quadsystem
meshsurf=GetSurface(mesh,1)
qverts=CountVertices(meshsurf)/4
Dim quadsys#(qverts,14)
;	0-xcoord
;	1-ycoord
;	2-zcoord
;	3-widthscale
;	4-heightscale
;	5-rotate
;	6-timer uno
;	7-timer two
;	8-for bright future
;	9-just for fun
;	10-sucriface to gods
;	11-reserved x
;	12-reserved y
;	13-reserved z


For i=0 To qverts-1

quadsys#(i,0)=VertexX(meshsurf,i*4)	;	x position
quadsys#(i,1)=VertexY(meshsurf,i*4)		;	y position
quadsys#(i,2)=VertexZ(meshsurf,i*4)		;	z position
quadsys#(i,3)=Rnd(1,3)							;	width scale
quadsys#(i,4)=Rnd(1,3)							;	height scale
quadsys#(i,5)=Rnd(0,359.99)					;	angle of rotate
quadsys#(i,11)=VertexX(meshsurf,i*4)	;	x position
quadsys#(i,12)=VertexY(meshsurf,i*4)		;	y position
quadsys#(i,13)=VertexZ(meshsurf,i*4)		;	z position

Next
End Function



Function QuadroFlipper(srcobj,quadsystem)

aim=srcobj
mesh=quadsystem
meshsurf=GetSurface(mesh,1)
qvert=CountVertices(meshsurf)-1
For number=4 To qvert-1 Step 4
v0=number
v1=v0+1
v2=v0+2
v3=v0+3

x0#=quadsys#(number/4,0)
y0#=quadsys#(number/4,1)
z0#=quadsys#(number/4,2)
sw#=quadsys#(number/4,3)
sh#=quadsys#(number/4,4)
ar#=quadsys#(number/4,5)
TFormPoint x0,y0,z0,mesh,aim

TFormNormal  TFormedX(),TFormedY(),TFormedZ(),aim,aim
a#=TFormedX()
b#=TFormedY()
c#=TFormedZ()

a1#=Cos(ACos(a)-90)
x01#=a1*Cos(ar)+b*Sin(ar)
y01#=b*Cos(ar)+a1*Sin(ar)
z01#=c*Cos(ar)

b2#=Cos(ACos(b)+90)
x02#=a*Cos(-ar)+b2*Sin(-ar)
Y02#=b2*Cos(-ar)+a*Sin(-ar)
z02#=c*Cos(ar)

TFormVector x01,y01,z01,aim,mesh

vx1#=TFormedX()*sw
vY1#=TFormedY()*sw
vZ1#=TFormedZ()*sw

TFormVector x02,y02,z02,aim,mesh

vx2#=TFormedX()*sh
vY2#=TFormedY()*sh
vZ2#=TFormedZ()*sh


VertexCoords meshsurf,v0,x0,y0,z0
VertexCoords meshsurf,v1,x0+vx1,y0+vy1,z0+vz1
VertexCoords meshsurf,v2,x0+vx2,y0+vy2,z0+vz2
VertexCoords meshsurf,v3,x0+vx1+vx2,y0+vy1+vy2,z0+vz1+vz2
;it's more faster and accurate  than updatenormals 
VertexNormal meshsurf,v0,vx2,vy1,vyz2
VertexNormal meshsurf,v1,vx2,vy1,vyz2
VertexNormal meshsurf,v2,vx2,vy1,vyz2
VertexNormal meshsurf,v3,vx2,vy1,vyz2
Next
;UpdateNormals mesh


End Function


Function CreateQuadSystem(number)
mesh=CreateMesh()
meshsurf=CreateSurface(mesh)

For i=0 To number
x1#=Rnd(-60,60)
y1#=Rnd(0,120)
z1#=Rnd(-60,60)
v0=AddVertex(meshsurf,x1,y1,z1,0,0)
v1=AddVertex(meshsurf,x1+1,y1,z1,0,1)
v2=AddVertex(meshsurf,x1,y1+1,z1,1,0)
v3=AddVertex(meshsurf,x1+1,y1+1,z1,1,1)

AddTriangle(meshsurf,v0,v1,v2)
AddTriangle(meshsurf,v3,v2,v1)

Next
UpdateNormals Mesh


testtex=CreateTexture(256,256,256)
SetBuffer TextureBuffer(testtex)
Color 127,127,127
Rect 0,0,128,128
Rect 128,128,128,128
Color 235,240,235
Rect 0,128,128,128
Rect 128,0,128,128
SetBuffer BackBuffer()
EntityTexture mesh,testtex,0,0


pltex=CreateTexture(256,256,256)
SetBuffer TextureBuffer(pltex)
Color 27,27,27
Rect 0,0,128,128
Rect 128,128,128,128
Color 127,127,127
Rect 0,128,128,128
Rect 128,0,128,128
SetBuffer BackBuffer()
ScaleTexture pltex,80,80
plane=CreatePlane()
EntityTexture plane,pltex

Return mesh

End Function


Function control(speed#,mousesensitivity#)
If KeyDown(2) WireFrame True Else WireFrame False
mxs#=mxs#+(MouseXSpeed()/5.0)
mys#=mys#+(MouseYSpeed()/5.0)
RotateEntity camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
If KeyDown(17) Or KeyDown(200) MoveEntity camera,0,0,speed#
If KeyDown(31) Or KeyDown(208) MoveEntity camera,0,0,-speed#
If KeyDown(30) Or KeyDown(203) MoveEntity camera,-speed#,0,0
If KeyDown(32) Or KeyDown(205) MoveEntity camera,speed#,0,0
PositionEntity pivot,EntityX#(camera,1),EntityY#(camera,1),EntityZ#(camera,1)
PositionEntity camera,0,0,0


Text 100,10,"polygons in view "+TrisRendered()
If (MilliSecs()-timer3)<>0 Text 100,40,"Frames per second is: "+1000/(MilliSecs()-timer3)
End Function
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
aleksxxxl (16.08.2011)