|
3D-программирование Вопросы, касающиеся программирования 3D мира |
12.05.2011, 16:52
|
#16
|
scientist.alien
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений (для 2,593 пользователей)
|
Ответ: Организация системы частиц
Не помню тонкостей именно б3д, в общем случае алгоритм такой: - берём вертекс буффер в массив;
- удаляем из массива ненужные вершины;
- то же самое делаем с индекс буффером;
- присваиваем сурфейсу обратно вершинный и индексный буфферы.
Здесь же пожно сделать маленький хак - не удалять вертексы, а помечать их как удалённые, полностью скрывать, а когда потребуется - призывать в другом месте. Способы скрывания - от альфы вершин до переноса координат вершин в далекие края.
Другой возможный хак - отложенное удаление. Делаем как в верхнем случае скрытие вершин, и раз в X тактов помеченные на удаление (желательно в том такте, где нет большой нагрузки, допустим, делать это всё после основной игровой логики и предварительно замеряв время выполнения этой логики. Потом замерянное время выполнения сравниваем со среднестатистическим значением за последние 1000 кадров (навскидку), и если условия благоприятные (малое время выполнеия логики) - модифицируем сурфейс системы частиц) собственно удаляем.
P.S.
Пора мне завязывать со вложенными мыслями... Жалко нельзя в формате MindMap ответы писать))
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab. We LOVE you. We MADE you.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.05.2011, 18:30
|
#17
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Организация системы частиц
Сообщение от L.D.M.T.
|
при чем тут огонь из примера сделанный за 2 минуты из подножных картинок ?
сделай свой эмиттер из своей медии
__________________
|
(Offline)
|
|
12.05.2011, 18:33
|
#18
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Организация системы частиц
память линейно заполненна данными
видеокарта ее рисует
надо смещать
|
(Offline)
|
|
15.05.2011, 19:07
|
#19
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Организация системы частиц
Спасибо большое всем за содействие. Ваша помощь дала мне хорошего пинка в работе
|
(Offline)
|
|
29.05.2011, 16:01
|
#20
|
ПроЭктировщик
Регистрация: 20.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений (для 24 пользователей)
|
Ответ: Организация системы частиц
Привет всем!
Есть вопрос о количестве загружаемых частиц...
У меня на компе получилось создать максимум = 13824
Вот код:
Graphics3D 640,480,32,2
SetBuffer BackBuffer()
Global spr
For z=0 To 24
For y=0 To 24
For x=0 To 24
spr=CreateSprite()
EntityAlpha spr,Rnd(0.05,0)
PositionEntity spr,x,y,z
Next
Write "|"
Next
Print
Next
cam=CreateCamera()
PositionEntity cam,0,10,-20
While Not KeyHit(1)
MoveEntity cam,3,0,0
PointEntity cam,spr
RenderWorld
Flip
Wend
End
У кого больше?
Возможно ли вопше создать больше, а если да то как?
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
|
(Offline)
|
|
29.05.2011, 16:10
|
#21
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Организация системы частиц
Примерно как-то так:
http://www.forum.boolean.name/showpo...9&postcount=52
Спрайты самые лаговые.
Лучше использовать Квады и AddVertex / AddTriangle / AddMesh
Уважаемый ABTOMAT это делал в world.bb, Function buildSide(
|
(Offline)
|
|
29.05.2011, 16:15
|
#22
|
ПроЭктировщик
Регистрация: 20.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений (для 24 пользователей)
|
Ответ: Организация системы частиц
Да спасибо... Я понял что ето возможно...
Если я создаю массив частиц хотя бы (25х24х24) - вилетает Memory access violation
...
Попробую тогда квадами...
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
|
(Offline)
|
|
30.05.2011, 19:17
|
#23
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Организация системы частиц
У меня на компе получилось создать максимум = 13824
|
блиц не сдох штоль на таком количестве дипов? или тебе не реалтайм?
|
(Offline)
|
|
31.05.2011, 01:47
|
#24
|
ПроЭктировщик
Регистрация: 20.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений (для 24 пользователей)
|
Ответ: Организация системы частиц
Сообщение от HolyDel
блиц не сдох штоль на таком количестве дипов? или тебе не реалтайм?
|
Нет, не сдох как видно на скрине и работает в realtime правда всего 5-10 fps... А чьо? вот кода 24*24*25 тогда дохнет...
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
|
(Offline)
|
|
31.05.2011, 18:02
|
#25
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Организация системы частиц
работает в realtime правда всего 5-10 fps..
|
вот ето я и называю сдох.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
02.06.2011, 09:01
|
#26
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Организация системы частиц
Ну и апдейт квада, поворачиваем его на камеру.
Function Un_SinglesurfaceParticleSys_UpdateParticle(h)
Un_ssp.Un_SinglesurfaceParticleSys_Particle = Object.Un_SinglesurfaceParticleSys_Particle(h)
xTFormVector -Un_ssp\Scale#,-Un_ssp\Scale#,0,Un_SinglesurfaceParticleSys_Camera ,0
xVertexCoords Un_ssp\Surface,Un_ssp\v_In[0],Un_ssp\x+xTFormedX#(),Un_ssp\y+xTFormedY#(),Un_ss p\z+xTFormedZ#()
xTFormVector Un_ssp\Scale#,-Un_ssp\Scale#,0,Un_SinglesurfaceParticleSys_Camera ,0
xVertexCoords Un_ssp\Surface,Un_ssp\v_In[1],Un_ssp\x+xTFormedX#(),Un_ssp\y+xTFormedY#(),Un_ss p\z+xTFormedZ#()
xTFormVector -Un_ssp\Scale#,Un_ssp\Scale#,0,Un_SinglesurfacePart icleSys_Camera,0
xVertexCoords Un_ssp\Surface,Un_ssp\v_In[2],Un_ssp\x+xTFormedX#(),Un_ssp\y+xTFormedY#(),Un_ss p\z+xTFormedZ#()
xTFormVector Un_ssp\Scale#,Un_ssp\Scale#,0,Un_SinglesurfacePart icleSys_Camera,0
xVertexCoords Un_ssp\Surface,Un_ssp\v_In[3],Un_ssp\x+xTFormedX#(),Un_ssp\y+xTFormedY#(),Un_ss p\z+xTFormedZ#()
End Function
|
Как то не правильно функция работает. Квады превращаются в треугольники..
Переставил "-" у "Un_ssp\Scale#" и с первым вертексом что то не то, но остальные нормально на камеру разворачиваются.
|
(Offline)
|
|
05.06.2011, 17:44
|
#27
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Организация системы частиц
Как вращать вертексы квада? С Sin и Cos получается совсем не то.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.06.2011, 23:13
|
#28
|
Разработчик
Регистрация: 19.05.2009
Адрес: Россия Иркутская область
Сообщений: 350
Написано 51 полезных сообщений (для 66 пользователей)
|
Ответ: Организация системы частиц
Попробовал сделать огонь в Particle AMT Вроде не плохо получается...
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.08.2011, 23:21
|
#29
|
AnyKey`щик
Регистрация: 30.01.2011
Сообщений: 10
Написано 2 полезных сообщений (для 21 пользователей)
|
Ответ: Организация системы частиц
Сообщение от EvilChaotic
Далее функции ротации и перемещения и скейла.
Перемещения можно сделать, прибавив вектор
x = x + x1
y = y + y1
z = z + z1
Ротация
Это sin/cos со scale и углом.
|
И всё же как нормально настроить ротацию, может кто сможет объяснить?
Пробывал играться с синусами и косинусами и скейлом в итоге ротацию настроил, но стоит только привязать квад ТФормВектор к камере так квад начинает беспорядочно крутиться в разные стороны... в общем не получается.
Сделал ротацию текстуры, но это не выход, т.к. текстура вертится на всех квадах одинакого, а это совсем не гуд
В системе частиц которую выложил Tormoz не пашет редактор под windows 7, хоть и можно конечно переписать функцию LoadEmitter в CreateEmitter , но если честно то хочется свою систему частиц в которой я как рыба в воде, но вот беда ротацию никак не настрою с ориентацией квада на камеру!
|
(Offline)
|
|
16.08.2011, 00:05
|
#30
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:16.
|