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)
ООП -
|
|
| |