|
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, время: 07:39.
|