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

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

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

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

Ответ
 
Опции темы
Старый 25.06.2011, 21:15   #1
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Система имитации поведения спрайтов.

Хм... Сделал я нечто странное, с любопытным поведением. Если сгенерить меш в котором на каждые 4 последовательно идущие точки приходится пара полигонов, то эта нашептанная дьяволом вещь повернет каждую пару полигонов перпендикулярно вектору связывающему начало координат и координаты первого вертекса в координатах тела относительно которого эти полигоны равняются. Как ни странно получилось.

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

x0#=VertexX(meshsurf,number)
y0#=VertexY(meshsurf,number)
z0#=VertexZ(meshsurf,number)
TFormPoint x0,y0,z0,mesh,aim

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

x01#=-Cos(ACos(a)+90)
y01#=-b
z01#=-c

x02#=a
Y02#=Cos(ACos(b)+90)
z02#=c

TFormVector x01,y01,z01,aim,mesh
vx1#=TFormedX()
vY1#=TFormedY()
vZ1#=TFormedZ()

TFormVector x02,y02,z02,aim,mesh
vx2#=TFormedX()
vY2#=TFormedY()
vZ2#=TFormedZ()

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
Люди еще помнящие математику, где эта хрень может быть оптимизирована? Или это самый быстрый способ найти два вектора перпендикулярных данному?

Плюс приятный и совершенно неожиданный момент этой хрени, что она затеняет полигоны повернутые спиной к источнику света.

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(3,light)
ScaleMesh meshlight,0.3,0.3,0.3
EntityFX meshlight,1
AmbientLight 15,15,15

;spring=CreateSpring(18,2,14,11,5,36)
mz=CreateQuadSystem(800)

While Not KeyHit(1)
timer3=MilliSecs()
PointEntity light,camera
PositionEntity light,25*Sin(MilliSecs()/30),25,25*Cos(MilliSecs()/30)
TurnEntity mz,0,0.5,0
QuadroFlipper(camera,mz)



UpdateWorld
RenderWorld

control(0.5,1.4)
Flip 0
Wend
End

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

x0#=VertexX(meshsurf,number)
y0#=VertexY(meshsurf,number)
z0#=VertexZ(meshsurf,number)
TFormPoint x0,y0,z0,mesh,aim

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

x01#=-Cos(ACos(a)+90)
y01#=-b
z01#=-c

x02#=a
Y02#=Cos(ACos(b)+90)
z02#=c

TFormVector x01,y01,z01,aim,mesh
vx1#=TFormedX()
vY1#=TFormedY()
vZ1#=TFormedZ()

TFormVector x02,y02,z02,aim,mesh
vx2#=TFormedX()
vY2#=TFormedY()
vZ2#=TFormedZ()

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)
Dim quadsys#(number,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
mesh=CreateMesh()
meshsurf=CreateSurface(mesh)

For i=0 To number
x1#=Rnd(-30,30)
y1#=Rnd(-30,30)
z1#=Rnd(-30,30)
quadsys(number,0)=x1
quadsys(number,1)=y1
quadsys(number,2)=z1
quadsys(number,3)=1
quadsys(number,4)=1
quadsys(number,5)=0
quadsys(number,11)=x1
quadsys(number,12)=y1
quadsys(number,13)=z1
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


Return mesh

End Function


Function CreateSpring(torrad#,inrad#,elements,segments,vitk i,shagvitka#)

mesh=CreateMesh()
meshsurf=CreateSurface(mesh)

For i=0 To vitki*elements
For h=0 To segments


x1#=torrad*Sin(i*360/elements)+inrad*Cos(h*360/segments)*Sin(i*360/elements)
y1#=torrad*Cos(i*360/elements)+inrad*Cos(h*360/segments)*Cos(i*360/elements)
z1#=inrad*Sin(h*360/segments)+shagvitka*i/elements

AddVertex meshsurf,x1,z1,y1,inrad*h/segments,inrad*i/elements

Next
Next

For x=0 To vitki*elements
For i=0 To segments
v0=i+segments*X
v1=i+segments*X+1
v2=i+segments*X+segments
v3=i+segments*X+segments+1
If v3<=CountVertices(meshsurf)-1 Then
AddTriangle meshsurf,v0,v2,v3
AddTriangle meshsurf,v1,v0,v3
EndIf
Next
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()
ScaleTexture testtex,0.2,0.2
EntityTexture mesh,testtex,0,0


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(20 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),Entity Z#(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


Пример тут ^^

Последний раз редактировалось dsd, 10.08.2011 в 03:06.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (25.06.2011)
Старый 25.06.2011, 22:37   #2
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений
(для 6,852 пользователей)
Ответ: Система имитации поведения спрайтов.

Вот пропёрло, потрошитель геометрии
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 25.06.2011, 22:40   #3
Nuprahtor
Элита
 
Аватар для Nuprahtor
 
Регистрация: 26.07.2008
Сообщений: 1,972
Написано 1,095 полезных сообщений
(для 3,923 пользователей)
Ответ: Система имитации поведения спрайтов.

Скомпильте, что-ли...
(Offline)
 
Ответить с цитированием
Старый 25.06.2011, 22:57   #4
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Система имитации поведения спрайтов.

Вот экезешник.

Еще бы научиться делать сплошную поверхность нескольких пересекающихся труб, и можно замутить отличное резкое деревце. Не хуже чем в спидтри. Причем я уже почти вижу как :D.

Последний раз редактировалось dsd, 10.08.2011 в 03:06.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
Nuprahtor (25.06.2011), Randomize (25.06.2011)
Старый 26.06.2011, 13:38   #5
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Система имитации поведения спрайтов.

Научил это независимо вращать пару полигонов вокруг ветора, и масштабировать независимо по горизонтали и вертикали. Правда перестало плавно затенять полигоны. По виду замутил систему частиц.




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,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
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(1600)
FillArray(mz)


While Not KeyHit(1)
timer3=MilliSecs()
PointEntity light,camera
PositionEntity light,125*Sin(MilliSecs()/30),125,125*Cos(MilliSecs()/30)
TurnEntity mz,0,0.5,0
updatearray(mz)
QuadroFlipper(camera,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,5)=MilliSecs()/10+i
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,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(20 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),Entity Z#(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

Последний раз редактировалось dsd, 10.08.2011 в 03:06.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
Egor Rezenov (26.06.2011), HolyDel (27.06.2011)
Старый 26.06.2011, 14:59   #6
Gector
Легенда
 
Аватар для Gector
 
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений
(для 5,072 пользователей)
Ответ: Система имитации поведения спрайтов.

Это ты систему частиц сингл-меш мутишь как я понял?)
__________________
Ибо как сказал Бгдн:
(Offline)
 
Ответить с цитированием
Старый 26.06.2011, 17:36   #7
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Система имитации поведения спрайтов.

В принципе я как обычно тыкал пальцами по кнопочкам. Но в итоге получилось нечто похожее.

Вот это:

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

еще не менеджер частиц, но имхо самое сложное повернуть полигон, а не описать его траекторию и поведение.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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