 |
Xors3D Графический движок с поддержкой DirectX9 |
15.07.2011, 15:32
|
#1
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Phisics и игрок
Допустим я сделал объект игрок, присвоил ему физику. Когда он падает на плоскость, особенно на не ровную, он начинает отскакивать, кататься и т.д. Как грамотно организовать, так чтобы работала физика (гравитация, импульсы и т.д.), но что бы таких глупостей присущих объекту-игроку небыло?
|
(Offline)
|
|
15.07.2011, 15:36
|
#2
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Phisics и игрок
xEntitySetLinearVelocity
xEntitySetAngularFactor
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.07.2011, 21:26
|
#3
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Phisics и игрок
невыходит все уже перепробовал. Камера - игрок. Начинает сама летать отскакивать скользить! Как это все убрать, оставив возможность не проникать сквозь стены, и двигать предметы прикасаясь к ним?
|
(Offline)
|
|
20.07.2011, 21:33
|
#4
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Phisics и игрок
Вот кусок кода из какого-то моего проэкта.

Type TPlayer
Field ENTITY
Field CAM
Field PHYS
Field COLL_H
Field LOOK_H_F
Field LOOK_H_S
Field PICK_H
Field C_PITCH#,M_SPD_X#,M_SPD_Y#,CAM_XV#,CAM_YV#,CAM_MAX_ANGLE#=89.9
Field HEIGHT:Byte
Field MASS:Byte
Field RADIUS:Byte
Field X#,Y#,Z#
Field RX#,RY#,RZ#
Field LOOK_F_VEC_X#,LOOK_F_VEC_Z#,LOOK_S_VEC_X#,LOOK_S_VEC_Z#
Field DRAG_OBJ:TProp
Field DRAG_OBJ_MSH_H%
Field DRAG_SPD:Byte=3
Field DRAG_MAX_TVEL:Byte
Field DRAG_MAX_DIST:Byte=12
Function Create:TPlayer(HEIGHT:Byte,MASS:Byte,RADIUS:Byte,X#=0,Y#=0,Z#=0,RY#=0)
Player:TPlayer = New TPlayer
Player.HEIGHT:Byte=HEIGHT:Byte
Player.MASS:Byte=MASS:Byte
Player.RADIUS:Byte=RADIUS:Byte
Player.ENTITY=xCreatePivot()
Player.CAM=xCreateCamera()
xCameraEnableShadows(Player.CAM)
Player.PHYS=xEntityAddCapsuleShape(Player.ENTITY,20,Player.RADIUS,Player.HEIGHT)
Player.COLL_H=nCreateCapsule(Player.HEIGHT,Player.RADIUS)
Player.LOOK_H_F=xCreatePivot()
Player.LOOK_H_S=xCreatePivot()
Player.PICK_H=xCreatePivot()
xPositionEntity(Player.ENTITY,X,Y,Z,1)
xPositionEntity(Player.CAM,X,Y+Player.HEIGHT,Z,1)
xPositionEntity(Player.COLL_H,X,Y,Z+10,1)
xPositionEntity(Player.LOOK_H_F,X,Y,Z+10,1)
xPositionEntity(Player.LOOK_H_S,X-10,Y,Z,1)
xPositionEntity(Player.PICK_H,xEntityX(Player.CAM,1),xEntityY(Player.CAM,1),xEntityZ(Player.CAM,1)+10,1)
xEntityParent(Player.CAM,Player.ENTITY)
xEntityParent(Player.COLL_H,Player.ENTITY)
xEntityParent(Player.LOOK_H_F,Player.ENTITY)
xEntityParent(Player.LOOK_H_S,Player.ENTITY)
xEntityParent(Player.PICK_H,Player.CAM)
xRotateEntity(Player.ENTITY,0,RY,0,1)
xCameraRange(Player.CAM,.7,500)
xEntityAlpha(Player.COLL_H,.3)
xEntitySetFriction(Player.ENTITY,0)
xEntitySetAngularFactor(Player.ENTITY,0,1.0,0)
xEntityDisableSleeping(Player.ENTITY)
Return Player
EndFunction
Method GetLowNY:Float()
Local LastY#=0
Local LowNY:Float
For Local i:Byte = 0 To xEntityCountContacts(ENTITY)
LowNY:+xEntityGetContactNY(ENTITY,i)
Next
Return LowNY
EndMethod
Method Control(spd#,key1=0,key2=0,key3=0,key4=0,key5=0,key6=0)
Local SideMod#=.5
Local PickMod=1000
If xKeyDown(key1)
xEntitySetLinearVelocity(ENTITY,spd*LOOK_F_VEC_X+xEntityGetLinearVelocityX(ENTITY),xEntityGetLinearVelocityY(ENTITY),spd*LOOK_F_VEC_Z+xEntityGetLinearVelocityZ(ENTITY))
EndIf
If xKeyDown(key3)
xEntitySetLinearVelocity(ENTITY,spd*-LOOK_F_VEC_X,xEntityGetLinearVelocityY(ENTITY),spd*-LOOK_F_VEC_Z)
EndIf
If xKeyDown(key2)
xEntitySetLinearVelocity(ENTITY,spd*LOOK_S_VEC_X*SideMod,xEntityGetLinearVelocityY(ENTITY),spd*LOOK_S_VEC_Z*SideMod)
EndIf
If xKeyDown(key4)
xEntitySetLinearVelocity(ENTITY,spd*-LOOK_S_VEC_X*SideMod,xEntityGetLinearVelocityY(ENTITY),spd*-LOOK_S_VEC_Z*SideMod)
EndIf
If xKeyHit(key5) And GetLowNY()<>0
xEntityApplyCentralImpulse(ENTITY,0,250*GetLowNY(),0)
EndIf
If MOUSE_DOWN1=1
xPhysicsRayCast(xEntityX(CAM,1),xEntityY(CAM,1),xEntityZ(CAM,1),xEntityX(PICK_H,1),xEntityY(PICK_H,1),xEntityZ(PICK_H,1),0)
DRAG_OBJ:TProp=TProp.GetProp(xPhysicsGetHitEntity())
EndIf
If xKeyDown(key1)=0 And xKeyDown(key2)=0 And xKeyDown(key3)=0 And xKeyDown(key4)=0 And GetLowNY()<>0
xEntitySetLinearVelocity(ENTITY,0,xEntityGetLinearVelocityY(ENTITY),0)
EndIf
EndMethod
Method Look(M_SPEED#)
Local M_X_S#=xMouseXSpeed()*M_SPEED
Local M_Y_S#=xMouseYSpeed()*M_SPEED
CAM_XV=M_X_S Mod(360)
CAM_YV:+M_Y_S
If CAM_YV<-CAM_MAX_ANGLE#
CAM_YV=-CAM_MAX_ANGLE#
EndIf
If CAM_YV>CAM_MAX_ANGLE#
CAM_YV=CAM_MAX_ANGLE#
EndIf
xMoveMouse(GW/2,GH/2)
xEntitySetAngularVelocity(ENTITY,0,CAM_XV,0)
xRotateEntity(CAM,CAM_YV,xEntityYaw(CAM),0)
EndMethod
Method ManageDrag()
If xMouseUp(1)
ReleaseDrag()
EndIf
If DRAG_OBJ<>Null
If xEntityDistance(DRAG_OBJ.MESH,ME.ENTITY)<DRAG_MAX_DIST
DRAG_OBJ_MSH_H=DRAG_OBJ.MESH
Local DRAG_VEC_X#=xEntityX(PICK_H,1)-xEntityX(DRAG_OBJ.MESH,1)
Local DRAG_VEC_Y#=xEntityY(PICK_H,1)-xEntityY(DRAG_OBJ.MESH,1)
Local DRAG_VEC_Z#=xEntityZ(PICK_H,1)-xEntityZ(DRAG_OBJ.MESH,1)
xEntitySetLinearVelocity(DRAG_OBJ.MESH,DRAG_VEC_X#*DRAG_SPD,DRAG_VEC_Y#*DRAG_SPD,DRAG_VEC_Z#*DRAG_SPD)
If xEntityGetAngularVelocityX(DRAG_OBJ.MESH)>DRAG_MAX_TVEL Or xEntityGetAngularVelocityY(DRAG_OBJ.MESH)>DRAG_MAX_TVEL Or xEntityGetAngularVelocityZ(DRAG_OBJ.MESH)>DRAG_MAX_TVEL
xEntitySetAngularVelocity(DRAG_OBJ.MESH,DRAG_MAX_TVEL,DRAG_MAX_TVEL,DRAG_MAX_TVEL)
EndIf
Else
ReleaseDrag()
EndIf
EndIf
EndMethod
Method ReleaseDrag()
DRAG_OBJ=Null
DRAG_OBJ_MSH_H=0
EndMethod
Method Update()
ManageDrag()
If DEBUG_PHYS=0
xHideEntity(COLL_H)
Else
xShowEntity(COLL_H)
EndIf
X=xEntityX(ENTITY,1)
Y=xEntityY(ENTITY,1)
Z=xEntityZ(ENTITY,1)
Look(.4)
LOOK_F_VEC_X=xEntityX(LOOK_H_F,1)-xEntityX(ENTITY,1)
LOOK_F_VEC_Z=xEntityZ(LOOK_H_F,1)-xEntityZ(ENTITY,1)
LOOK_S_VEC_X=xEntityX(LOOK_H_S,1)-xEntityX(ENTITY,1)
LOOK_S_VEC_Z=xEntityZ(LOOK_H_S,1)-xEntityZ(ENTITY,1)
Control(1,xKEY_W,xKEY_A,xKEY_S,xKEY_D,xKEY_SPACE,xKEY_C)
EndMethod
EndType
У меня всё пашет, но доработать надо, не закончил. То что ненужно сам уберёшь.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо NitE за это полезное сообщение:
|
|
20.07.2011, 21:36
|
#5
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Phisics и игрок
ООО спасибо огромнейшее выручил!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:23.
|