Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 16.08.2011, 00:54   #31
aleksxxxl
AnyKey`щик
 
Регистрация: 30.01.2011
Сообщений: 10
Написано 2 полезных сообщений
(для 21 пользователей)
Ответ: Организация системы частиц

спасибо! твой код очень помог Я конечно очень плохо разбираюсь в математике в отличии от тебя, по этому твои выражения немного подпалили мой мозг
А вообще ориентация на нулевой вертекс мне немного не подходит, щас буду пробывать ориентировать на центр квада.
(Offline)
 
Ответить с цитированием
Старый 16.08.2011, 01:18   #32
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 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 за это полезное сообщение:
aleksxxxl (16.08.2011), dsd (16.08.2011), L.D.M.T. (16.08.2011)
Старый 16.08.2011, 19:02   #34
L.D.M.T.
Бывалый
 
Аватар для L.D.M.T.
 
Регистрация: 10.06.2006
Сообщений: 808
Написано 354 полезных сообщений
(для 832 пользователей)
Ответ: Организация системы частиц

на 4.51 не компилит - ругается на разнообразные ашипки. пытался разгрести, но чем дальше в лес, тем толще партизаны...
__________________
Per Aspera Ad Astra...
(Offline)
 
Ответить с цитированием
Старый 16.08.2011, 19:14   #35
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Организация системы частиц

А переписать пошагово не вариант?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 09:16.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com