|
3D-программирование Вопросы, касающиеся программирования 3D мира |
16.08.2011, 00:54
|
#31
|
AnyKey`щик
Регистрация: 30.01.2011
Сообщений: 10
Написано 2 полезных сообщений (для 21 пользователей)
|
Ответ: Организация системы частиц
спасибо! твой код очень помог Я конечно очень плохо разбираюсь в математике в отличии от тебя, по этому твои выражения немного подпалили мой мозг
А вообще ориентация на нулевой вертекс мне немного не подходит, щас буду пробывать ориентировать на центр квада.
|
(Offline)
|
|
16.08.2011, 01:18
|
#32
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Организация системы частиц
Тогда минусуй половинки векторов, 0 точка дальше также.
Векторы это проще тригонометрии. Я вообще имею желание линчевать того кто придумал преподавать в школе тригонометрию и бэсик.
Исчо математики
По теоремме толи пифагора толи архимеда, длина вектора: d=sqr(x1^2+y1^2+z1^2), единичный вектор (x1/d,y1/d,z1/d) это вектор чья длина равняется единице, этот вектор есть (косинус(угол вектора к оси икс),косинус(к игрек), косинус(к зед))
векторное произведение.
Function Cross(x1#,y1#,z1#,x2#,y2#,z2#)
vecar(0,0)=y1*z2-y2*z1 ; икс
vecar(1,0)=z1*x2-z2*x1; игрек
vecar(2,0)=x1*y2-x2*y1;зед
End Function
А это скалярное
косинус( угол между векторами)=(x1*x2+y1*y2+z1*z2)/(l1*l2)
Уравнение плоскости в пространстве: ax+by+cz+d=0
вектор(a,b,c) перпендикулярен к этой плоскости, це нормаль. d смещение от оси координат.
|
(Offline)
|
|
16.08.2011, 01:32
|
#33
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Организация системы частиц
;MsgDebug(str())
;******************************************
Declare RGBA(rl.l,g.l,b.l,l.l)
Structure v
x.f
y.f
z.f
EndStructure
Structure pas
mem.l[4]
surf.l
ver.l
EndStructure
Structure Sf
surf.l
entity.l
ver.l
EndStructure
Structure act
mem.l[4]
surf.l
ver.l
x.f ;position
y.f
z.f
xr.f ;rotate position entity
yr.f
;zr.f
xm.f ;move entity
ym.f
zm.f
xmd.f ;delta move
ymd.f
zmd.f
xt.f ;turn entity
yt.f
xtd.f ;delta turn
ytd.f
xd.f ;speed translate
yd.f
zd.f
xda.f ;delta speedT
yda.f
zda.f
r.f ;color
g.f
b.f
rd.f ;delta color
gd.f
bd.f
rot.f ;rotate texture
al.f ;alpha
sc.f ;size
osc.f ;size obraz
fsqr.l ;flag sqr
rotd.f ;delta rotate
ald.f ;delta alpha
scd.f ;delta scale
liv.f ;lives
bild.l
EndStructure
ProcedureDLL AttachProcess(Hinstance)
Global camera.l,vec
Global surfPart
Global a.act
Global p.pas
Global countP,countA
NewList a.act()
NewList p.pas()
NewList s.Sf()
Dim d.f(3,3)
EndProcedure
;*******************************************************************
ProcedureDLL CreateBank_tm(surf.l,count,cam)
f.l= PeekL(surf+28)
camera=cam
For ver.l=0 To count-1 Step 4
AddElement(p())
;MsgDebug(Str(ver))
p()\ver=ver
For i=0 To 3
p()\mem[i]=f.l+((ver+i)*64)
p()\surf=surf.l
PokeL(p()\mem[i]+24,RGBA(0,255,255,255))
Next
Next
AddElement(s())
s()\surf=surf
s()\entity=mesh
s()\ver=count-1
;MsgDebug(Str(s()\ver))
EndProcedure
;=====================================
ProcedureDLL AddBank_tm(surf.l,count)
f.l= PeekL(surf+28)
ForEach s()
If s()\surf=surf
vera.l=s()\ver
; MsgDebug(Str(vera))
s()\ver=s()\ver+count*4
EndIf
Next
;------------------------
For ver.l=vera+1 To vera+count*4 Step 4
AddElement(p())
p()\surf=surf.l
p()\ver=ver
For i=0 To 3
p()\mem[i]=f.l+((ver+i)*64)
PokeL(p()\mem[i]+24,RGBA(0,255,255,255))
Next
Next
;--------------------------
ForEach a()
If a()\surf=surf
;MsgDebug(Str(a()\ver))
For i=0 To 3
a()\mem[i]=f.l+((a()\ver+i)*64)
Next
EndIf
Next
;----------------------------
ForEach p()
If p()\surf=surf
For i=0 To 3
p()\mem[i]=f.l+((p()\ver+i)*64)
PokeL(p()\mem[i]+24,RGBA(0,255,255,255))
Next
EndIf
Next
;-------------------
;
EndProcedure
;===============================
ProcedureDLL DeleteBank_tm(surf.l)
ForEach a()
If a()\surf=surf
DeleteElement(a())
EndIf
Next
ForEach p()
If p()\surf=surf
DeleteElement(p())
EndIf
Next
ForEach s()
If s()\surf=surf
DeleteElement(s())
EndIf
Next
EndProcedure
;================================
ProcedureDLL AddParticle_tm(surf.l,x.f, y.f, z.f, xr.f,yr.f,xm.f,ym.f,zm.f, xmd.f,ymd.f,zmd.f, xt.f,yt.f, xtd.f,ytd.f, xd.f, yd.f, zd.f,xda.f, yda.f, zda.f,r.f,g.f,b.f,rd.f,gd.f,bd.f, rot.f,rotd.f, al.f, ald.f, sc.f, scd.f,fsqr.l, liv.f,bild.l)
yspeh=0
e=LastElement(p())
ee:
If e<>0
If p()\surf<>surf
e=PreviousElement(p())
Goto ee
EndIf
;----------------------------
yspeh=1
AddElement(a())
a()\ver=p()\ver
For i=0 To 3
a()\mem[i]=p()\mem[i]
PokeL(p()\mem[i]+24,RGBA(0,255,255,255))
Next
a()\surf=p()\surf
a()\x=x
a()\y=y
a()\z=z
a()\xr=xr*0.017453
a()\yr=yr*0.017453
a()\xm=xm
a()\ym=ym
a()\zm=zm
a()\xmd=xmd
a()\ymd=ymd
a()\zmd=zmd
a()\xt=xt
a()\yt=yt
a()\ xtd=xtd
a()\ ytd=ytd
a()\xd=xd
a()\yd=yd
a()\zd=zd
a()\xda=xda
a()\yda=yda
a()\zda=zda
a()\r=r
a()\g=g
a()\b=b
a()\rd=rd
a()\gd=gd
a()\bd=bd
a()\rot=(rot-45)*0.017453
a()\al=al
a()\sc=sc
a()\osc=sc
a()\ rotd=rotd*0.017453
a()\ald=ald
a()\scd=scd
a()\fsqr=fsqr.l
a()\liv=liv
a()\bild=bild
;=============================
PokeF (a()\mem[0],a()\x-1)
PokeF (a()\mem[0]+4,a()\y+1)
PokeF (a()\mem[0]+8,a()\z)
PokeF (a()\mem[1],a()\x+1)
PokeF (a()\mem[1]+4,a()\y+1)
PokeF (a()\mem[1]+8,a()\z)
PokeF (a()\mem[2],a()\x+1)
PokeF (a()\mem[2]+4,a()\y-1)
PokeF (a()\mem[2]+8,a()\z)
PokeF (a()\mem[3],a()\x-1)
PokeF (a()\mem[3]+4,a()\y-1)
PokeF (a()\mem[3]+8,a()\z)
DeleteElement(p())
EndIf
ProcedureReturn yspeh
EndProcedure
;================================
ProcedureDLL UpdateParticle_tm()
countA=0
;============================
camX.f=PeekF(camera+16*4)
camY.f=PeekF(camera+17*4)
camZ.f=PeekF(camera+18*4)
ForEach a()
;countA=countA+1
;-------------------color===========
a()\r=a()\r+a()\rd
a()\g=a()\g+a()\gd
a()\b=a()\b+a()\bd
If a()\r>255
a()\r=255
EndIf
If a()\g>255
a()\g=255
EndIf
If a()\b>255
a()\b=255
EndIf
If a()\r<0
a()\r=0
EndIf
If a()\g<0
a()\g=0
EndIf
If a()\b<0
a()\b=0
EndIf
;===========alpha==========
a()\al=a()\al+a()\ald
If a()\al>255
a()\al=255
EndIf
If a()\al<0
a()\al=0
EndIf
;==============turn===========
a()\ rot=a()\ rot+a()\ rotd ;texture
a()\xt=a()\xt+a()\xtd
a()\yt=a()\yt+a()\ytd
a()\xr=a()\xr+a()\xt
a()\yr=a()\yr+a()\yt
;===============move===========
If a()\xm>0
a()\xm=a()\xm*a()\xmd
EndIf
If a()\ym>0
a()\ym=a()\ym*a()\ymd
EndIf
If a()\zm>0
a()\zm=a()\zm*a()\zmd
EndIf
sinXm.f=Sin(a()\xr)
sinYm.f=Sin(a()\yr)
cosXm.f=Cos(a()\xr)
cosYm.f=Cos(a()\yr)
a()\x=a()\x +( a()\xm*cosYm+a()\ym*-sinXm*sinYm+a()\zm*-sinYm*cosXm)
a()\y=a()\y+( a()\ym*cosXm+a()\zm*-sinXm )
a()\z=a()\z+( a()\xm*sinYm+a()\ym*sinXm*cosYm+a()\zm*cosYm*cosXm)
;a()\x=a()\x +( a()\xm*Cos(a()\yr)+a()\ym*-Sin(a()\xr)*Sin(a()\yr)+a()\zm*-Sin(a()\yr)*Cos(a()\xr) )
;a()\y=a()\y+( a()\ym*Cos(a()\xr)+a()\zm*-Sin(a()\xr) )
;a()\z=a()\z+( a()\xm*Sin(a()\yr)+a()\ym*Sin(a()\xr)*Cos(a()\yr)+a()\zm*Cos(a()\yr)*Cos(a()\xr) )
;===========translate==========
a()\xd=a()\xd+a()\xda
a()\yd=a()\yd+a()\yda
a()\zd=a()\zd+a()\zda
a()\x=a()\x +a()\xd
a()\y=a()\y+a()\yd
a()\z=a()\z+a()\zd
;========scale==========
If a()\fsqr
a()\sc=a()\sc* (a()\scd*0.5* Sqr(a()\osc/a()\sc)+a()\scd*0.5)
Else
a()\sc=a()\sc*a()\scd
EndIf
If a()\bild=0
xn.f=a()\x-camX
yn.f=a()\y-camY
zn.f=a()\z-camZ
Else
xn.f=1
yn.f=0
zn.f=100
EndIf
;--------------------normalisate--------
l.f = Sqr(xn*xn + yn*yn + zn*zn)
vecy.f = yn.f/l
l.f = Sqr(xn*xn + zn*zn)
zna.f=zn.f/l
;------------------angle normals----------
anX.f=ACos(vecy )-1.57
anY.f=ACos(zna)*-(xn/Abs(xn))
;-----------------------------
sina.f=a()\sc*Sin(a()\ rot)*0.7
cosa.f=a()\sc*Cos(a()\ rot)*0.7
sinX.f=Sin(anX)
sinY.f=Sin(anY)
cosx.f=Cos(anX)
cosY.f=Cos(anY)
d(0,0)=-sina*cosY+cosa*(-sinX*sinY)+a()\x
d(0,1)=cosa*cosx+a()\y
d(0,2)=-sina*sinY+cosa*sinX*cosx+a()\z
d(1,0)=cosa*cosY+sina*(-sinX*sinY)+a()\x
d(1,1)=sina*cosx+a()\y
d(1,2)=cosa*sinY+sina*sinX*cosY+a()\z
d(2,0)=sina*cosY-cosa*(-sinX*sinY)+a()\x
d(2,1)=-cosa*cosx+a()\y
d(2,2)=sina*sinY-cosa*sinX*Cos(anY)+a()\z
d(3,0)=-cosa*cosY-sina*(-sinX*sinY)+a()\x
d(3,1)=-sina*cosx+a()\y
d(3,2)=-cosa*sinY-sina*sinX*cosY+a()\z
;----------------------------------
For i=0 To 3
PokeF (a()\mem[i],d(i,0))
PokeF (a()\mem[i]+4,d(i,1))
PokeF (a()\mem[i]+8,d(i,2))
PokeL(a()\mem[i]+24,RGBA(a()\al,a()\r,a()\g,a()\b))
Next
;===============live=============
a()\liv=a()\liv-1
If a()\liv<0 Or a()\al<0.01
AddElement(p())
p()\surf=a()\surf
p()\ver=a()\ver
For i=0 To 3
p()\mem[i]=a()\mem[i]
c.f=Random(10)*i
PokeF (p()\mem[i],a()\x+c)
PokeF (p()\mem[i]+4,a()\y+c)
PokeF (p()\mem[i]+8,a()\z-c)
PokeL(p()\mem[i]+24,RGBA(0,255,255,255))
Next
;=============================
DeleteElement(a())
EndIf
Next
ForEach s()
PokeL(s()\surf+64,0)
Next
ProcedureReturn CountList(a())
EndProcedure
;================================
Procedure RGBA(rl.l,gl.l,bl.l,l.l)
MOV eax,rl
SHL eax,24
MOV ebx,gl
SHL ebx,16
MOV edx,bl
SHL edx,8
OR eax,ebx
OR eax,edx
OR eax,l
ProcedureReturn
EndProcedure
;==============================
; IDE Options = PureBasic 4.10 Beta 2 (Windows - x86)
; ExecutableFormat = Shared Dll
; CursorPosition = 81
; FirstLine = 67
; Folding = --
; EnableAsm
; Executable = particle_amt.dll
; ExecutableFormat=Shared Dll
; EnableAsm
;
; EOF
__________________
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо tormoz за это полезное сообщение:
|
|
16.08.2011, 19:02
|
#34
|
Бывалый
Регистрация: 10.06.2006
Сообщений: 808
Написано 354 полезных сообщений (для 832 пользователей)
|
Ответ: Организация системы частиц
на 4.51 не компилит - ругается на разнообразные ашипки. пытался разгрести, но чем дальше в лес, тем толще партизаны...
|
(Offline)
|
|
16.08.2011, 19:14
|
#35
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Организация системы частиц
А переписать пошагово не вариант?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:45.
|