|
3D-программирование Вопросы, касающиеся программирования 3D мира |
05.04.2007, 11:38
|
#1
|
AnyKey`щик
Регистрация: 09.10.2006
Сообщений: 19
Написано 0 полезных сообщений (для 0 пользователей)
|
Реализация трассера
Подскажите, как лучше реализовать полет трассирующей пули
Вариант с ньютоновской библой:
Есть объект-цилиндр, вылетающий в определенном направлении, с необходимым разбросом, под нужным углом.
Не могу сообразить, как можно прописать коллизию, чтобы при столкновении с "землей", цилиндр не начинал отталкиваться и вертеться, а рандомно улетал в какойм-нибудь случайном направлении.
И еще по ньютону: я так понял, что сделать "ходячий" раг-долл невозможно(?). А если и можно, то наверное проще, при попадании пули в куклу (которая пока еще просто ентити), заменять ее раг-долом. Но тогда невозможно сделать реалистичное поведение уже появившегося раг-долла(он же не знает, как "его" до этого шандорахнуло)
|
(Offline)
|
|
05.04.2007, 15:52
|
#2
|
AnyKey`щик
Регистрация: 23.01.2007
Сообщений: 7
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Реализация трассера
ненужно пулю делать физическим объектом, просто проверяй коллизию и в случае столкновения с землей либо уничтожай ее, либо направляй в рандомном направлении)) и еще добавь пули строку жизнь и после выстрела с каждым циклом отнимай какоето кол- во
также с рэгдолом пока он еще жив, отнимай у него жизни а когда жизнь <= 0 находи точку столкновения и прикладывай силу(импульс) величиной равной жизни твоей пули
Graphics3D 640,480,16,2
SetBuffer BackBuffer()
Const ENEMYCOL=1,BULLETCOL=2, POL=2
Collisions BULLETCOL,ENEMYCOL,2,1
Collisions BULLETCOL,POL,2,2
Player.TPlayer=NewPlayer()
PLayer\piv = CreatePivot()
PLayer\eye = CreateCamera(PLayer\piv)
TranslateEntity PLayer\eye,0,0.9,0
CameraRange PLayer\eye,.1,200
Player\guns=NewGun(Player,300,1.8,2,-1,1)
ShotTimer.TTimers=NewTimer()
PositionEntity PLayer\Piv,0,3,0
EntityRadius PLayer\Piv,.9
EntityType PLayer\Piv,1
tex=CreateDummyTexture(256,256)
ScaleTexture tex,10,10
ground=CreatePlane() ; or the map mesh etc.
EntityTexture ground,tex
EntityType ground,POl
origin_bullet=CreateSprite2()
temp=CopyMesh(origin_bullet)
RotateMesh temp,0,0,90
AddMesh temp,origin_bullet
FreeEntity temp
ScaleMesh origin_bullet,.05,.05,3
EntityFX origin_bullet,1+16
EntityColor origin_bullet,255,200,0
HideEntity origin_bullet
origin_enemy=CreateCube()
ScaleEntity origin_enemy, 1, 3, 1
EntityType origin_enemy,ENEMY_TYPE
HideEntity origin_enemy
For i=1 To 100
NewEnemy(origin_enemy)
Next
sp#=.1 ; main walking speed (not connected with wobbling)
shoe_size#=7.0 ; stepspeed for wobbling camera (eg. 7=running, 4=walking)
head_bang_X#=0.1 ; amount of wobbling
head_bang_Y#=0.1
Collisions 1,2,2,2
While Not KeyHit(1)
mxs#=MouseXSpeed()/4.0
mys#=MouseYSpeed()/4.0
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
camxa#=camxa-mxs Mod 360
camya#=camya+mys
If camya<-90 Then camya=-90
If camya>90 Then camya=90
RotateEntity PLayer\Piv,0,camxa,0
RotateEntity PLayer\eye,camya,0,0
If MouseDown(1)
If Player\guns\Nextshot Then
NewShot(origin_bullet,3,Player\guns)
Player\guns\Nextshot=False
End If
Player\guns\Nextshot=TickTimer(ShotTimer,15)
End If
UpdateBullet(Player\guns)
MoveEntity PLayer\eye,0,-.05,0 ; simplified gravity
walking=0
If KeyDown(30) Then: MoveEntity PLayer\Piv,-sp,0,0 : walking=1: EndIf
If KeyDown(32) Then: MoveEntity PLayer\Piv, sp,0,0 : walking=1: EndIf
If KeyDown(17) Then: MoveEntity PLayer\Piv,0,0, sp : walking=1: EndIf
If KeyDown(31) Then: MoveEntity PLayer\Piv,0,0,-sp : walking=1: EndIf
; >>>>>>>>>wobble camera
If walking=1
a1#=(a1#+shoe_size) Mod 360
Else
;a1#=a1#*0.8
EndIf
PositionEntity PLayer\eye,Cos(a1#)*head_bang_X#,Sin(90+a1#*2)*hea d_bang_Y#,0,0
; PositionEntity camera,Cos(a1#)*head_bang_X#,Sin(270+a1#*2)*head_b ang_Y#,0,0 ; or try this one instead!
UpdateWorld
RenderWorld
; >>>>>>>>>control footstep sound
If Sin(90+a1*2)<-.85
If footstep_needed<>0
Color 255,255,255
Text 50,50, "Tap!" ; play a footstep sound here!
footstep_needed=0
EndIf
Else
footstep_needed=1
EndIf
VWait:Flip 0
Wend
End
Function CreateDummyTexture(w,h)
tex=CreateTexture(w,h)
SetBuffer TextureBuffer(tex)
Color 255,255,255
For i=0 To 1000
Color Rand(255),Rand(255),Rand(255)
Line Rand(0,w-1),Rand(0,h-1),Rand(0,w-1),Rand(0,h-1)
Next
SetBuffer BackBuffer()
Return tex
End Function
Type TTimers
Field orig,out
End Type
Function NewTimer.TTimers()
Local time.Ttimers = New Ttimers
Return time
End Function
Function TickTimer(time.TTimers,firerate)
If Not time\out>=(1000/firerate) Then
time\out=MilliSecs()-time\orig
Else
time\orig=MilliSecs()
time\out=0
Return True
End If
Return False
End Function
Type TEnemy
Field entity,life
;.....
End Type
Function NewEnemy(mesh)
newenemy.TEnemy=New TEnemy
newenemy\entity=CopyEntity(mesh)
EntityType newenemy\entity,ENEMYCOL
newenemy\life=255
EntityColor newenemy\entity,255,newenemy\life,newenemy\life
NameEntity newenemy\entity,Handle(newenemy)
PositionEntity newenemy\entity,Rand(-50,50),Rand(50),Rand(-50,50)
End Function
Type TGun
Field range
Field accuracy#
Field mesh
Field nextshot
;.....
End Type
Function NewGun.TGun(player.TPlayer,range,accuracy#,x,y,z)
Gun.TGun=New TGun
gun\range=range
gun\accuracy=accuracy
gun\mesh=CreatePivot(player\eye)
PositionEntity gun\mesh,x,y,z
Return gun
End Function
Type TPlayer
Field piv
Field eye
Field pitch#,yaw#
Field aup,adown
Field Xsens#,Ysens#
Field guns.TGun
Field nextshot
;....
End Type
Function NewPlayer.TPlayer(xsens#=0.5,ysens#=0.5,aup=80,ado wn=-75)
player.TPlayer=New TPlayer
player\eye=CreateCamera()
player\aup=aup
player\adown=adown
player\xsens=xsens
player\ysens=ysens
player\nextshot=True
Return player
End Function
Function CameraCtrl(player.TPlayer)
player\pitch=player\pitch+MYspeed*player\ysens
player\yaw=player\yaw-MXspeed*player\xsens
If player\yaw>359 Then player\yaw=0
If player\yaw<0 Then player\yaw=359
If player\pitch<player\adown Then player\pitch=player\adown
If player\pitch>player\aup Then player\pitch=player\aup
RotateEntity player\eye,player\pitch,player\yaw,0
MoveMouse GHwidth,GHheight
End Function
Type TBullet
Field entity
Field range
Field speed
Field life = 500
End Type
Function NewShot(mesh,speed,gun.TGun)
shot.TBullet=New TBullet
shot\entity=CopyEntity(mesh,gun\mesh)
Entityalpha shot\entity,Rnd(0,1)
EntityType shot\entity,BULLETCOL
EntityParent shot\entity,0
shot\range=gun\range
shot\speed=speed
RotateEntity shot\entity,EntityPitch(shot\entity)+Rnd(-gun\accuracy,gun\accuracy),EntityYaw(shot\entity)+ Rnd(-gun\accuracy,gun\accuracy),0
End Function
Function UpdateBullet(gun.TGun)
Local entity
Local newenemy.TEnemy
For shot.TBullet=Each TBullet
If Not (shot\range<=0) Then
MoveEntity shot\entity,0,0,shot\speed
entity=EntityCollided(shot\entity,POL)
If entity Then
;ScaleMesh shot\entity,.05,.05,.3
RotateEntity shot\entity,Rnd(-90,90),Rnd(-90,90),0
Else
entity=EntityCollided(shot\entity,ENEMYCOL)
If entity Then
newenemy=Object.TEnemy(EntityName(entity))
If Not(newenemy\life)<=0 Then
NewEnemy\life=newenemy\life-Rand(1,30)
EntityColor newenemy\entity,255,newenemy\life,newenemy\life
Else
FreeEntity NewEnemy\entity
Delete newenemy
End If
shot\range=0
Else
shot\range=shot\range-shot\speed
End If
End If
Else
FreeEntity shot\entity
Delete shot
EndIf
Next
End Function
Function CreateSprite2(file$="",flag=1,doubleside=0)
Local mesh=CreateMesh()
Local surf=CreateSurface(mesh)
Local v0=AddVertex (surf,-1,0,2 ,0,1)
Local v1=AddVertex (surf,1,0,2 ,1,1)
Local v2=AddVertex (surf,-1,0,0 ,0,0)
Local v3=AddVertex (surf,1,0,0 ,1,0)
AddTriangle (surf,v0,v1,v3)
AddTriangle (surf,v3,v2,v0)
If file$<>"" Then
Local temp=LoadTexture(file$,flag)
EntityTexture mesh,temp
FreeTexture temp
End If
If doubleside Then EntityFX mesh,16
Return mesh
End Function
|
|
(Offline)
|
|
05.04.2007, 15:57
|
#3
|
AnyKey`щик
Регистрация: 09.10.2006
Сообщений: 19
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Реализация трассера
ОООО, огромное спасибо, не все еще сообразил, но пример отличный
Ща буду на этом примере смотреть и вписывать туды ньютоновскую дрябедень
|
(Offline)
|
|
05.04.2007, 16:03
|
#4
|
AnyKey`щик
Регистрация: 23.01.2007
Сообщений: 7
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Реализация трассера
пожалуйста)))) как разберешься, пиши дам тебе рэгдол))) и вообще напиши что тебе конкретно нужно)))
|
(Offline)
|
|
06.04.2007, 02:35
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Реализация трассера
Я бы сделал так: Загружаем энтити (чел), и находим чайлды (части тела), и привязываем к ним физ. примитивы, в цикле они должны двигатся с анимацией (прописать надо). Далее пулю я всётаки сделал бы цилиндриком, но вообще ньютон с быстрой скоростью плохо работает, правдо у ФизиКса есть на то лекартсво (функция, которая борется с проскоками быстрых тел), вот, и при коллизии пули с частью тела перса, уже делал бы обратную зависимость не энтити>физ.примитивы, а рагдолл-перс, и ту силу передал бы в часть тела рагдолла. И всё.
|
(Offline)
|
|
06.04.2007, 09:59
|
#6
|
AnyKey`щик
Регистрация: 09.10.2006
Сообщений: 19
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Реализация трассера
to moka
На словах звучит неплохо )) Код наверное довольно сложный выйдет
Буду пробовать (кстати и у ньютона тоже есть спец обсчет быстрых тел, избежание туннелирования и т.п.)
Короче буду работать в свободное от работы время )). И уж на основе опытов посмотрю, есть ли такая необходимость в физическом движке, можт и без него нормально будет. Хотя в ньютоне мне раг-доллы понравились больно.
PS А что, на самом деле Ньютон работает 5 минут?
вроде не замечал ) И ключа никакого не брал. Его и вводить-то некуда
|
(Offline)
|
|
06.04.2007, 10:06
|
#7
|
AnyKey`щик
Регистрация: 09.10.2006
Сообщений: 19
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Реализация трассера
Сообщение от storm.di
пожалуйста)))) как разберешься, пиши дам тебе рэгдол))) и вообще напиши что тебе конкретно нужно)))
|
Если честно, сам до конца еще не знаю, что мне нужно)))
Пока прощупываю возожности, и свои и языка, отсюда и вопросы))))
|
(Offline)
|
|
10.04.2007, 16:12
|
#8
|
AnyKey`щик
Регистрация: 09.10.2006
Сообщений: 19
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Реализация трассера
Помогите.
Как сделать источник света, который двигался бы вместе с пулей (родителем) и освещал только небольшое пространство объектов и земли вокруг себя прямо в движении (ну то есть нормальный такой светящийся трассер, светящийся в плане - осещащющий).
Разбор всех известных мне примеров ничего не дал. Совсем уже окосел от попыток.
Подкинте листинг плиз.
|
(Offline)
|
|
15.04.2007, 14:59
|
#9
|
AnyKey`щик
Регистрация: 24.02.2007
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Реализация трассера
storm.di,А можешь выложить пример с RagDoll'ом плз...
|
(Offline)
|
|
15.04.2007, 15:28
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Реализация трассера
насчет света:
сожно создать свет
createlught(3) - потипа лампочки и назначить ему
lightrange()-какой надо. !НО, помните, что освещение повертексное! это значит что сцена, точнее свет от пули будет смотреться нормально только тогда, когда полигональность того, на что этот свет будет падать, достаточно высока.
А, да, созданный свет надо припарентить к пуле и забытьь о его существовании.
ПС. Больше 8-ми источников света для сцены не получицца делать, и еще каждый источник света неплохо жрет фпс (по идее должне жрать, я лично не замечал), т.к. освещенность каждой вершины надо перерасчитывать.
|
(Offline)
|
|
15.04.2007, 15:44
|
#11
|
AnyKey`щик
Регистрация: 24.02.2007
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
nJunk,a не проще сделать спрайтом?
storm.di vbmenu_register("postmenu_37321", true); ,так что насчет ragdoll'a?
|
(Offline)
|
|
17.04.2007, 02:09
|
#12
|
AnyKey`щик
Регистрация: 23.01.2007
Сообщений: 7
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Реализация трассера
TheSorrow, стукнись в асю 4018273
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:22.
|