[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Bullet, невесомость.
filkar2005Дата: Среда, 07.04.2021, 20:36 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 26
Награды: 0
Репутация: 0
Статус: Offline
Я убрал гравитацию из мира bullet, но обнаружил, что персонаж (родной класс bullet) всё равно падает. Ускорение его падения не зависит от тяготения мира. Можно это как-то исправить? Да и выглядит это странно - гравитация мира не влияет на персонажей, только на обычные тела.

<°)))><
 
serg-kkzДата: Среда, 07.04.2021, 20:56 | Сообщение # 2
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Чтоб получать ответ на форуме не обязательно в повествовательной форме рассказывать что сделал. Для этого и придумали короткие примеры кода для демонстрации проблемы,  я например гадать не умею не на кофе, не на шаре и на воде тоже не умею. Если речь идет про Bullet Character, то это не физический объект, а кинематический, то есть только обнаруживает столкновения.

ООП  -  

Сообщение отредактировал serg-kkz - Среда, 07.04.2021, 20:57
 
filkar2005Дата: Среда, 07.04.2021, 21:07 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 26
Награды: 0
Репутация: 0
Статус: Offline
Класс rocket. То есть для него bullet не считает гравитацию? Просто движется, пока не столкнётся с чем-то?


Код
from panda3d.core import *
from panda3d.bullet import *
from direct.gui.DirectGui import *
import direct.directbase.DirectStart
from direct.task import Task
import sys

global bliz
bliz = 10000

base.cam.setPos(0, -50, 0)
base.cam.lookAt(0, 0, 0)
base.camLens.setNearFar(1, 10000000000)
base.set_background_color(0, 0, 0, 1)  # цвет фона окна
base.setFrameRateMeter(True) 

base.accept('escape', sys.exit)

room = render.attachNewNode("room")
room.setPos(0, 0, 0)
room.reparentTo(render)

debugNode = BulletDebugNode('Debug')  
debugNP = render.attachNewNode(debugNode)  
debugNP.show()  
world = BulletWorld()  
world.setDebugNode(debugNP.node())  
world.setGravity(Vec3(0, 0, 10))  

global all_objects
all_objects = []

stars = loader.loadModel("textures/stars.obj")
stars.reparent_to(render)
stars.set_scale(20000000)
stars_texture = loader.loadTexture("textures/звёзды.jpg")
stars.set_texture(stars_texture)

class star():
    def __init__(self, R, m, coord, V, name, texture):
        print("инициализация звезды начата")
        self.R = R
        self.m = m
        self.coord = coord
        self.V = V
        self.name = name
        
        self.texture = loader.loadTexture(texture)
        self.model = loader.loadModel("textures/планеты/планета.obj")
        self.model.setTexture(self.texture)
        self.model.setScale(R/bliz)
        self.model.setPos(self.coord[0]/bliz, self.coord[1]/bliz, self.coord[2]/bliz)
        self.model.reparentTo(render)
        
        self.lightpivot = render.attachNewNode("lightpivot")
        self.lightpivot.setPos(self.coord[0]/bliz, self.coord[1]/bliz, self.coord[2]/bliz)
        self.plight = PointLight('plight')
        self.plight.setColor((30, 30, 20, 1))
        self.plnp = self.lightpivot.attachNewNode(self.plight)
        self.plnp.setPos(0, 0, 0)
        room.setLight(self.plnp)
        self.model.reparentTo(self.plnp)
        room.setShaderAuto()
        print("инициализация звезды закончена")

class rocket:
    def __init__(self, m, h, r, coord):
        self.h = h
        self.r = r
        shape = BulletCapsuleShape(r, h - 2*r, ZUp)
        self.playerNode = BulletCharacterControllerNode(shape, r, 'Player')
        self.player = room.attachNewNode(self.playerNode)
        self.player.setPos(coord[0], coord[1], coord[2])
        self.player.setCollideMask(BitMask32.allOn())
        world.attachCharacter(self.player.node())
#        base.cam.reparentTo(self.player)
#        base.camLens.setNearFar(1, 10000000000)
#        base.cam.setPos(0, -2, 0) 
        
        self.m = m
        self.V = Vec3(0, 0, 0)
        self.W = 0
    def update(self):
        isSet = base.mouseWatcherNode.is_button_down
        if isSet('w'): self.V.setY(2.0)
        if isSet('s'): self.V.setY(-2.0)
        if isSet('a'): self.V.setX(-2.0)
        if isSet('d'): self.V.setX(2.0)
        if isSet('q'): self.W =  40.0
        if isSet('e'): self.W = -40.0
        if isSet('r'): self.doJump()
        self.playerNode.setAngularMovement(self.W)
        self.playerNode.setLinearMovement(self.V, True)

sun = star(20000, 1.9891 * (10 ** 30), [0, 0, 0], [0, 0, 0], "sun", 'textures/планеты/текстуры планет/солнце/13913_Sun_diff.jpg')
player = rocket(10, 3, 1, [0, -10, 0])

def update(task):
   # print(globalClock.getDt())
    world.doPhysics(globalClock.getDt())
    player.update()
    return task.cont

taskMgr.add(update, 'update')
base.run()


<°)))><

Сообщение отредактировал filkar2005 - Среда, 07.04.2021, 21:09
 
serg-kkzДата: Среда, 07.04.2021, 21:22 | Сообщение # 4
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
В Bullet нет класса Rocket, судя по коду это пользовательский класс который использует BulletCharacterControllerNode, это то о чем я говорил. И чтоб окончательно понять правило пользования физическим движком, нужно ясно понимать что полный контроль берет на себя Bullet и вмешаться можно лишь частично. То есть Bullet диктует поведение а не вы ему.

Чтоб отменить гравитацию на BulletCharacterControllerNode, нужно установить индивидуально экземпляру. Как - то так.

Код
self.playerNode = BulletCharacterControllerNode(shape, r, 'Player')
self.playerNode.setGravity(0)


ООП  -  
 
  • Страница 1 из 1
  • 1
Поиск: