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

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

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

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 15.07.2011, 15:32   #1
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Phisics и игрок

Допустим я сделал объект игрок, присвоил ему физику. Когда он падает на плоскость, особенно на не ровную, он начинает отскакивать, кататься и т.д. Как грамотно организовать, так чтобы работала физика (гравитация, импульсы и т.д.), но что бы таких глупостей присущих объекту-игроку небыло?
(Offline)
 
Ответить с цитированием
Старый 15.07.2011, 15:36   #2
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Phisics и игрок

xEntitySetLinearVelocity
xEntitySetAngularFactor
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pozitiffcat (15.07.2011)
Старый 20.07.2011, 21:26   #3
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Phisics и игрок

невыходит все уже перепробовал. Камера - игрок. Начинает сама летать отскакивать скользить! Как это все убрать, оставив возможность не проникать сквозь стены, и двигать предметы прикасаясь к ним?
(Offline)
 
Ответить с цитированием
Старый 20.07.2011, 21:33   #4
NitE
злобный флудер
 
Регистрация: 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)=And xKeyDown(key2)=And xKeyDown(key3)=And xKeyDown(key4)=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 за это полезное сообщение:
LLI.T.A.L.K.E.R. (20.03.2012), pozitiffcat (20.07.2011)
Старый 20.07.2011, 21:36   #5
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Phisics и игрок

ООО спасибо огромнейшее выручил!
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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