[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 22 из 22
  • «
  • 1
  • 2
  • 20
  • 21
  • 22
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
ДеЦЦкий сад "ПандЁнок"
fron_de_befДата: Среда, 11.08.2021, 20:19 | Сообщение # 316
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 5
Статус: Offline
проблема оказалась в значении sprite.setPos(pos_x, 1, pos_y)  1 нужно было заменить на большее значение типо 10... правда я готов палец дать на отсечение что нее менял это значение...  и все работало... и по идее видео это подтверждают... да даже если теоретически подумать что я изменил и забыл  мне бы терпения не хватило переправлять во всех старых версиях...
 
serg-kkzДата: Среда, 11.08.2021, 22:09 | Сообщение # 317
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Если честно это может быть связанно с изменением модели. Но повторюсь странно масштабировать плоский спрайт предварительно при загрузке, а потом его еще, смещать на несколько единиц. Насколько я помню, у вас орто камера и лучше бы использовать порядок отрисовки на прямую.

ООП  -  
 
serg-kkzДата: Среда, 11.08.2021, 22:12 | Сообщение # 318
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Возможно вы так же избавились от проблемы с видео картой, как вариант. Раньше помню у вас была проблема с порядком и масштабом, это происходило самопроизвольно.

ООП  -  
 
fron_de_befДата: Суббота, 11.09.2021, 20:22 | Сообщение # 319
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 5
Статус: Offline
Мне нужна помощь а то у меня уже кукуха слетела от расчетов как получить координаты изометрической сетки. Думал поможет чтение статей https://habr.com/ru/post/332922/ никак не помогло, уже на этапе как там советуют сетку поставить (та формула что в статье прописана оставляет между плитками охрененный зазор) поэтому хелп а то мой мозг уже отказывается над этим работать и шепчет мне все это бросить
 
serg-kkzДата: Суббота, 11.09.2021, 21:14 | Сообщение # 320
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Конкретней если можно. Где вы настраиваете сетку в render или aspect2d или же pixel2d. Если в render, то в чем смысл? В 3D вы работаете как обычно, но поворачиваете камеру на нужный угол.

ООП  -  
 
fron_de_befДата: Суббота, 11.09.2021, 21:44 | Сообщение # 321
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 5
Статус: Offline

Код
from direct.showbase.ShowBase import ShowBase
from panda3d.core import *
from direct.gui.DirectGui import *
import math

configVars = """
win-size 1366 768
load-display pandagl
show-frame-rate-meter true
textures-power-2 false
undecorated true
fullscreen false
"""

loadPrcFileData("", configVars)

map_1 = ["##################",
         "##################",
         "##################",
         "##################",
         "##################",
         "##################",
         "##################",  
         "##################",
         "##################",
         "##################",
         "##################",
         "##################",
         "##################"
             
         ]

map_1.reverse()

class MyGame(ShowBase):
    def __init__(self):
        super().__init__()
        self.set_background_color(0.1, 0.1, 0.1, 1)
        self.cam.setPos(0, -20, 0)
        base.disableMouse()

        lens = OrthographicLens()
        lens.setFilmSize(32, 24)
        self.cam.node().setLens(lens)

        self.pos_x_camera = 0
        self.pos_y_camera = 0
        self.test = []
        
        self.w_button = KeyboardButton.ascii_key('w')
        self.s_button = KeyboardButton.ascii_key('s')
        self.a_button = KeyboardButton.ascii_key('a')
        self.d_button = KeyboardButton.ascii_key('d')
        self.taskMgr.add(self.update_texture, "Update texture")
        

        
        for y, column  in enumerate(map_1):
            for x, line  in enumerate(column):
                if line == "#":

                    self.sprite_1 = self.createSprite("assets/images/grass.png", (x+y)*0.75+0.75, 0, (y-x)*0.5, 1)

      
      
    def update_texture(self, task):
        if base.mouseWatcherNode.hasMouse():
            mpos = base.mouseWatcherNode.getMouse()
            
            #
            #self.mpos_x = math.ceil(((mpos[0]/0.1874+0.5)-1+(self.pos_x_camera/3))-mpos[1]/0.0825)/1.5
            #self.mpos_y = mpos[1]/0.0825
            #self.test = [self.mpos_x, self.mpos_y]
            #print(self.mpos_x)
            #print(self.mpos_x)
        is_down = base.mouseWatcherNode.is_button_down
        if is_down(self.w_button):
            self.pos_y_camera += 0.125
        if is_down(self.s_button):
            self.pos_y_camera -= 0.125
        if is_down(self.a_button):
            self.pos_x_camera -= 0.125
        if is_down(self.d_button):
            self.pos_x_camera += 0.125
    
        pos_x = self.pos_x_camera
        pos_y = self.pos_y_camera     
        self.camera.setPos(pos_x, -20, pos_y)

        return task.cont
    

    def createSprite(self, name, pos_x, pos_z, pox_y, priority):
        sprite = loader.loadModel("assets/eggs/64_64")
        sprite_tex = loader.loadTexture(name)
        sprite.setPos(pos_x*2, pos_z, pox_y*2)
        sprite.setScale(11.25, 0, 7.5)
        sprite.setTexture(sprite_tex)
        sprite.setTransparency(TransparencyAttrib.MAlpha)
        sprite_tex.setMagfilter(SamplerState.FT_nearest)
        sprite.reparentTo(render)
        sprite.setBin("fixed", priority)
        return sprite

 

game = MyGame()
game.run()



 
serg-kkzДата: Суббота, 11.09.2021, 22:37 | Сообщение # 322
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Я вообще не въеду в чем проблема.

Код
from direct.showbase.ShowBase import ShowBase
from panda3d.core import OrthographicLens
from random import random

class Game(ShowBase):

    def __init__(self):
        ShowBase.__init__(self)

        model = loader.loadModel("sprite.bam")

        base.disableMouse()

        camera.setHpr(45, -30, 0)
        camera.setPos(5, -5, 5)

        lens = OrthographicLens()
        lens.setFilmSize(10, 10)
        base.cam.node().setLens(lens)

        for x in range(10):
            for y in range(10):
                sprate = model.copyTo(render)
                sprate.setX(x)
                sprate.setY(y)
                sprate.setColor(random(), random(), random(), 1)

game = Game()
game.run()



На хабре вроде все так описывают. Только с поправкой на 2D.
Прикрепления: 5956720.png (10.1 Kb)


ООП  -  

Сообщение отредактировал serg-kkz - Суббота, 11.09.2021, 23:15
 
fron_de_befДата: Воскресенье, 12.09.2021, 10:49 | Сообщение # 323
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 5
Статус: Offline
Вы действительно не поняли в чем проблема.
 У меня нет проблем с построением самой сетки, мне нужно получить координату наведя мышь на эту плитку, по типу 1 0, 2 0 3 0(что бы потом прописать алгоритм нахождение пути по текстовому шаблону карты). Сначала я хотел сделать как описано в статье, но как видите по видео что то с ней не так, это формула не работает в панде не знаю почему. Потом была мысль прописать тег каждой плитке при столкновении с мышью, но вот не задача так как сама 3д модель плитки прямоугольная и она заезжает на другую плитку это не надежно. Поэтому сейчас у меня осталось только одна мысль это преобразование координат  мыши по какой то формуле в нужные мне 0 1 02 03 и т д. Но спустя целый вчерашний день я так и не допер какую конкретно, по логике это что то должно быть типа (x * коэффициент -+ y * коэффициент) */коэффициент , что то вроде этого.   
Скажу сразу что ваш метод с поворотом карты( не настолько тупой это мысль приходила ко м не в голову) не для меня так как отражение текстур(а у меня стилистика пиксель арт если вы заметили) будет тоже кривым, так что нет. Это бы работало если бы у меня были либо сплошной цвет либо с большим разрешением где будет не заметно что плитки повернуты. 
 
serg-kkzДата: Воскресенье, 12.09.2021, 11:42 | Сообщение # 324
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Если вы хотите размещать сразу нарисованные тайлы в изометрической проекции то, как ни странно ответ прост.

Цитата
Мы наклоняем камеру по двум осям (поворачиваем камеру на 45 градусов вбок, потом на 30 градусов вниз). При этом создаётся ромбическая сетка, в которой ширина ячеек в два раза больше высоты. Такой стиль стал популярным благодаря стратегическим играм и экшн-RPG. Если посмотреть в этом виде на куб, то мы видим три его стороны (верхнюю и две боковые).

Обратите внимание что ширина ячеек в два раза больше высоты, думаю формулу составить не трудно. Однако вы уточнили что пытаетесь получить координату при клике мышью. Заметите что курсор мыши находится в экранных координатах 1 на 1*соотношение. Так просто этого сделать не получится, можно было бы рассчитать коэффициент по нахождению курсора от центра, а первую плитку разместить точно по центру, далее использовать математику , однако у вас камера перемещается. В этом случае вам нужно использовать либо встроенную систему столкновений, что думаю вам уже известно. Другой случай использовать расчеты на плоскости,  благо вам это подходит и не отнимает много ресурсов.

Код
from direct.showbase.ShowBase import ShowBase
from panda3d.core import Plane, Vec3, Point3, CardMaker

class YourClass(ShowBase):
  def __init__(self):
    ShowBase.__init__(self)
    self.disableMouse()
    self.camera.setPos(0, 60, 25)
    self.camera.lookAt(0, 0, 0)
    z = 0
    self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))
    self.model = loader.loadModel("jack")
    self.model.reparentTo(render)

    taskMgr.add(self.__getMousePos, "_YourClass__getMousePos")

  def __getMousePos(self, task):
    if base.mouseWatcherNode.hasMouse():
      mpos = base.mouseWatcherNode.getMouse()
      pos3d = Point3()
      nearPoint = Point3()
      farPoint = Point3()
      base.camLens.extrude(mpos, nearPoint, farPoint)
      if self.plane.intersectsLine(pos3d,
          render.getRelativePoint(camera, nearPoint),
          render.getRelativePoint(camera, farPoint)):
        print ("Mouse ray intersects ground plane at ", pos3d)
        self.model.setPos(render, pos3d)
    return task.again

YourClass()
base.taskMgr.run()

Но в этом случае, вам все равно нужно определиться с началами координат для плиток, чтоб понять откуда отчитывать. Если вы сделали что первая плитка будет 0, 0 то следующая по горизонту будет 1, 0, а если по вертикали 0.5, 0

При этом вам дополнительно нужно их сохранить под именами из пары координат в графе сцены. Чтоб потом можно было найти их по соответствующим координатам, сопоставив их с именами.


ООП  -  

Сообщение отредактировал serg-kkz - Воскресенье, 12.09.2021, 12:00
 
serg-kkzДата: Воскресенье, 12.09.2021, 12:04 | Сообщение # 325
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Конечно есть еще способ, создать геометрию по форме ромба. Тогда плитки не будут перекрываться и можно использовать обычные столкновения.

ООП  -  
 
serg-kkzДата: Воскресенье, 12.09.2021, 12:30 | Сообщение # 326
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Переделал код по ваш случай.
Код
from direct.showbase.ShowBase import ShowBase
from panda3d.core import Plane, Vec3, Point3

class YourClass(ShowBase):
def __init__(self):
   ShowBase.__init__(self)
   self.disableMouse()
   self.camera.setPos(0, -20, 0)

   self.plane = Plane(Vec3(0, 1, 0), Point3(0, 0, 0))

   taskMgr.add(self.__getMousePos, "MousePos3D")

def __getMousePos(self, task):
    if base.mouseWatcherNode.hasMouse():
        mpos = base.mouseWatcherNode.getMouse()
        pos3d = Point3()
        nearPoint = Point3()
        farPoint = Point3()
        base.camLens.extrude(mpos, nearPoint, farPoint)
        if self.plane.intersectsLine(pos3d,
            render.getRelativePoint(camera, nearPoint),
            render.getRelativePoint(camera, farPoint)):
            print(pos3d)
    return task.again

YourClass()
base.taskMgr.run()


ООП  -  

Сообщение отредактировал serg-kkz - Воскресенье, 12.09.2021, 12:31
 
fron_de_befДата: Понедельник, 13.09.2021, 18:58 | Сообщение # 327
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 5
Статус: Offline
Я нашел настолько великолепное, изящное и простое решение, что думаю мною бы гордился даже Джон Кармак. А главное сам, ничего слизанного. Есть несколько нюансов, но они зависят от размера экрана/ размера плитки/ точность расчетов. Тоесть другой размер экрана - другой коэффициент в формуле, точность зависит от того сколько цифр прописал после запятой и т. д. но это уже настраиваемые параметры. В остальном все работает отлично с учетом движения камеры. По быстрому объяснить что я сделал, не получиться тут прям хоть самому лекцию читать нужно или статью писать.

Прикрепления: map.zip (727.2 Kb)
 
serg-kkzДата: Понедельник, 13.09.2021, 20:29 | Сообщение # 328
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Я думаю нужно коэффициенты пересчитывать, если вы планирует позволить пользователям изменять размеры экрана. Так же советую все расчеты перемещения умножать на время рендеринга кадра.

Код

  def update_texture(self, task):
    
        dt = globalClock.getDt()

        is_down = base.mouseWatcherNode.is_button_down
        if is_down(self.w_button):
            self.pos_y_camera += 2*dt
        if is_down(self.s_button):
            self.pos_y_camera -= 2*dt
        if is_down(self.a_button):
            self.pos_x_camera -= 3*dt
        if is_down(self.d_button):
            self.pos_x_camera += 3*dt
    
        pos_x = self.pos_x_camera
        pos_y = self.pos_y_camera
        self.camera.setPos(pos_x, -20, pos_y)

        return task.cont

Так как частота кадров у всех разная, то и расстояние различается.

Решил глянуть насколько точно границы совпадают, видно что не очень точно они высчитываются.


ООП  -  

Сообщение отредактировал serg-kkz - Понедельник, 13.09.2021, 20:37
 
fron_de_befДата: Понедельник, 13.09.2021, 23:25 | Сообщение # 329
Сержант
Группа: Пользователи
Сообщений: 36
Награды: 0
Репутация: 5
Статус: Offline
не частота кадров тут не причем , главная неточность в одном коэффициенте 0.185748 а нужно 0.186338997(я считал грубо) плюс еще насколько точные значения прописаны (сколько знаков после запятой) я записал видео с объяснением и логикой там объяснен этот момент про неточность
 
serg-kkzДата: Понедельник, 13.09.2021, 23:34 | Сообщение # 330
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Я имел ввиду расстояние перемещения камеры, без умножения на время рендера кадра у всех будет разное. Тьфу скорость, пробуй убрать ограничение частоты и ты увидишь. Разумеется это не влияет на точность расчетов.

ООП  -  
 
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
  • Страница 22 из 22
  • «
  • 1
  • 2
  • 20
  • 21
  • 22
Поиск: