[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
ДеЦЦкий сад "ПандЁнок"
ninthДата: Среда, 09.11.2011, 11:09 | Сообщение # 226
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
По-моему никак. Разве что вручную установить нужный масштаб уже после привязки узла.

Quote (soos)
Есть перемещающийся и поворачивающийся персонаж, к нему привязан пустой Node,

Именно поэтому я говорил, что лучше делать в качестве корня объекта пустой узел единичного масштаба, а на него уже вешать модельку и крутить/масштабировать как хочешь, чтобы потом не заморачиваться подобными проблемами.
 
soosДата: Среда, 09.11.2011, 18:25 | Сообщение # 227
Майор
Группа: Пользователи
Сообщений: 82
Награды: 1
Репутация: 0
Статус: Offline
Quote (ninth)
Именно поэтому я говорил, что лучше делать в качестве корня объекта пустой узел единичного масштаба, а на него уже вешать модельку и крутить/масштабировать как хочешь, чтобы потом не заморачиваться подобными проблемами.

Не совсем понял какую иерархию объектов ты предлагаешь. Мой вариант на данный момент такой:

render <--- персонаж <--- пустой нод <--- камера

Cтрелочки это reparent. Дополнительно на пустой нод повешен CompassEffect для того чтобы не наследовать поворот от персонажа. В результате работает всё (удаление/приближение от/к объекту, вращение вокруг объекта) кроме масштабирования. При масштабировании персонажа масштабируется и камера. Эффект компаса должен по идее влиять и на масштаб, но панда ругается и вылетает при попытке повесить CompassEffect с включённым PScale.
 
ninthДата: Четверг, 10.11.2011, 00:35 | Сообщение # 228
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
как-то так
Code

     render
     |_ root_character_node (empty, scale = 1.0)
         |_ compass_node (empty, compass)
         |   |_ camera
         |_ character_model (Actor, scale = ??, rotation = ??)
 
soosДата: Четверг, 10.11.2011, 22:43 | Сообщение # 229
Майор
Группа: Пользователи
Сообщений: 82
Награды: 1
Репутация: 0
Статус: Offline
Quote (ninth)
...

Такой вариант то что надо. Но неужели нет способа привязать только Pos или только Rot? Хотя, это вряд ли
нужно, потому что с пустым корнем удобно: можно, например, на персонажа доспехи вешать и прочие вещи. Спасибо, использую такую иерархию.

Добавлено (10.11.2011, 22:43)
---------------------------------------------
Собственно, результат.

Сообщение отредактировал soos - Четверг, 10.11.2011, 16:45
 
ninthДата: Пятница, 11.11.2011, 00:07 | Сообщение # 230
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Может как-то и можно , но я не знаю как. Можно попробовать использовать wrtReparentTo вместо reparentTo - но это сработает только при первичном привинчивании к родителю.
 
Rivermacaroon0Дата: Воскресенье, 13.11.2011, 17:00 | Сообщение # 231
Рядовой
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
Добрый день. Подскажите пожалуйста как сделать систему диалогов. Я никак не могу сообразить как сделать что бы было разветвление диалога и он не сразу выскакивал на конечный результат и не знаю как сделать что бы при нажатии на модель второй раз моя система диалога не запускалась второй раз и не накладывалась друг на друга пробовал добавить suppressMouse=1 выдает ошибку как ни крутил.

Code

# -*- coding: utf_8 -*-
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectGui import *     
from pandac.PandaModules import TextNode
from direct.showbase.DirectObject import DirectObject

class dialog(DirectObject):
  def __init__(self):
   bk_text = "This is my Demo"
   textObject = OnscreenText(text = bk_text, pos = (0.95,-0.95),
   scale = 0.07,fg=(1,0.5,0.5,1),align=TextNode.ACenter,mayChange=1)
        
     
        
   def setText(arg):  
    bk_text = (arg)     
    textObject.setText(bk_text)
        
   def button(text, pos, comm):
    a = DirectButton(text = (text),scale=0.12,pos= (pos),command=(comm))
    
   def but1():
    b=setText('button1')
       
        
   def but2():
    b=setText('button2')
        
   def but3():
    b=setText('button3')
        
   def but4():
    b=setText('button4')
        
       
   button('but1',(-0.8,0.1,-0.65),but1)  
   button('but2',(-0.1,0.1,-0.65),but2)
   button('but3',(-0.8,0.1,-0.8),but3)
   button('but4',(-0.1,0.1,-0.8),but4)
       
 
serg-kkzДата: Воскресенье, 13.11.2011, 20:13 | Сообщение # 232
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Rivermacaroon0, не совсем тебя понял, но вот пример.

Code
# -*- coding: utf_8 -*-
import direct.directbase.DirectStart
from direct.gui.DirectGui import *
from pandac.PandaModules import *

textObject = OnscreenText(text = "This is my Demo", pos = (0, 0.5), scale = 0.07, fg=(1,0.5,0.5,1), align=TextNode.ACenter,mayChange=1)
     
shiper = {'Torgovat':['Pistolet', 'Avtomat'], 'Razgovor':['Zdorova', 'Kakie ludi', 'Idi na...']}

buff = []

def deist(arg):
     ot = 'Idi sam kozel'
     ot1 = 'Zdorovei vidali'
     ot2 = 'Da, ny'
      
     textObject.setText(arg)
      
     if (arg == 'Idi na...'):
         textObject.setText(ot)
     if (arg == 'Zdorova'):
         textObject.setText(ot1)
     if (arg == 'Kakie ludi'):
         textObject.setText(ot2)
          
def Select(arg):
     if (arg == 'exit'):
         Frame.hide()
         pers.show()
         Magazin.hide()
          
     if (arg == 'active'):
         pers.hide()
         Frame.show()
###########################################
     if (arg == 'Torgovat'):
         Frame.hide()
         Magazin.show()
         nn = 0.1
         for list in shiper['Torgovat']:
             slot = DirectButton(text = list, pos = (0, 0, nn), scale=0.1, command=deist, extraArgs = [list], relief=0)
             buff.append(slot)
             nn += 0.1
          
     if (arg == 'Torgovat_exit'):
         Frame.show()
         Magazin.hide()
         for i in xrange(len(buff)):
             buff[i].remove()
###########################################
     if (arg == 'Razgovor'):
         Frame.hide()
         Razgovor.show()
         nn = 0
         for list in shiper['Razgovor']:
             slot = DirectButton(text = list, pos = (0, 0, nn), scale=0.1, command=deist, extraArgs = [list], relief=0)
             buff.append(slot)
             nn += 0.1
          
     if (arg == 'Razgovor_exit'):
         Frame.show()
         Razgovor.hide()
         for i in xrange(len(buff)):
             buff[i].remove()
              
pers = DirectButton(text = 'shiper', pos = (0, 0, 0), scale=0.1, command=Select, extraArgs = ['active'])

Frame = DirectFrame(frameColor=(0.1, 0.1, 0.1, 0.5), frameSize=(-0.25, 0.25, -0.25, 0.25), pos=(0, 0, 0))
Frame.hide()

rp1 = DirectButton(text = 'Razgovor', pos = (0, 0, 0.1), scale=0.1, command=Select, extraArgs = ['Razgovor'], relief=0)
rp1.reparentTo(Frame)

rp2 = DirectButton(text = 'Torgovat', pos = (0, 0, 0), scale=0.1, command=Select, extraArgs = ['Torgovat'], relief=0)
rp2.reparentTo(Frame)

rp3 = DirectButton(text = 'Poka', pos = (0, 0, -0.1), scale=0.1, command=Select, extraArgs = ['exit'], relief=0)
rp3.reparentTo(Frame)

Magazin = DirectFrame(frameColor=(0.1, 0.1, 0.1, 0.5), frameSize=(-0.35, 0.35, -0.35, 0.35), pos=(0, 0, 0))
Magazin.hide()

Magazin_rp1 = DirectButton(text = 'Vihod', pos = (0, 0, -0.2), scale=0.1, command=Select, extraArgs = ['Torgovat_exit'], relief=1)
Magazin_rp1.reparentTo(Magazin)

Razgovor = DirectFrame(frameColor=(0.1, 0.1, 0.7, 0.5), frameSize=(-0.35, 0.35, -0.35, 0.35), pos=(0, 0, 0))
Razgovor.hide()

Razgovor_rp1 = DirectButton(text = 'Vihod', pos = (0, 0, -0.2), scale=0.1, command=Select, extraArgs = ['Razgovor_exit'], relief=1)
Razgovor_rp1.reparentTo(Razgovor)

run()


Тут надо получше подумать головой. Для разветвлений, думаю хорошо, подойдут словари, а на основе их значений можно генерировать диалоги. А словари могут содержать много вложенностей.

P.S.
У меня глюки что ли, я этот пост прочел, пошел сочинять решение. Пришел а его нет, несколько раз заходил... а его тютю. А не давно появился... Это еще что, я не давно видел около 140 гостей.


ООП  -  
 
serg-kkzДата: Воскресенье, 13.11.2011, 20:52 | Сообщение # 233
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Quote (Rivermacaroon0)
textObject.setText(arg)
в 17 строчке говорит global name 'arg' is not defined

Скопировал от сюда, ошибки нет. Прикрепляю файл.
Прикрепления: dia.py (3.5 Kb)


ООП  -  
 
Rivermacaroon0Дата: Воскресенье, 13.11.2011, 20:58 | Сообщение # 234
Рядовой
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
Спасибо большое, думаю вряд ли бы я сам такое сделал smile
Еще один вопрос, как сделать что бы при повторном нажатии допустим на модель не появлялся второй раз диалог если он уже открыт?


Сообщение отредактировал Rivermacaroon0 - Воскресенье, 13.11.2011, 21:03
 
serg-kkzДата: Воскресенье, 13.11.2011, 21:07 | Сообщение # 235
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Quote (Rivermacaroon0)
Еще один вопрос, как сделать что бы при повторном нажатии допустим на модель не появлялся второй раз диалог если он уже открыт?

создай пременную например:

self.flag_dialog = 0

и перед открытием проверяй его, если ноль открывем диалог и меняем:

self.flag_dialog = 1

и при повторном открытии(тыкании по модели) если равен 1 пусти по else: т.е. pass


ООП  -  

Сообщение отредактировал serg-kkz - Воскресенье, 13.11.2011, 21:10
 
serg-kkzДата: Воскресенье, 13.11.2011, 21:32 | Сообщение # 236
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Вот пример:

Code
import direct.directbase.DirectStart
from direct.gui.DirectGui import *
from pandac.PandaModules import *

textObject = OnscreenText(text = "status", pos = (0, 0.5), scale = 0.07, fg=(1,0.5,0.5,1), align=TextNode.ACenter,mayChange=1)

buff = []

flag_dialog = 0

def Open():
      global flag_dialog
      if (flag_dialog == 0):
          textObject.setText('Open')
          slot = DirectFrame(frameColor=(0.1, 0.1, 0.1, 0.5), frameSize=(-0.25, 0.25, -0.25, 0.25), pos=(0, 0, 0))
          buff.append(slot)
          flag_dialog = 1
          print 'proverka'
def Close():
      global flag_dialog
      for i in xrange(len(buff)):
          buff[i].remove()
      textObject.setText('Close')
      flag_dialog = 0
        
Open = DirectButton(text = 'Open', pos = (0, 0, 0), scale=0.1, command=Open)   
Close = DirectButton(text = 'Close', pos = (0, 0, -0.13), scale=0.1, command=Close)

run()


ООП  -  

Сообщение отредактировал serg-kkz - Воскресенье, 13.11.2011, 21:40
 
Rivermacaroon0Дата: Понедельник, 14.11.2011, 12:27 | Сообщение # 237
Рядовой
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 0
Статус: Offline
Спасибо большое ты очень помог.
Столкнулся с непонятной проблемой.
При добавление модели бокс из примера модель реагирует все хорошо, меняю модель на другую и она перестает работать не могу понять почему

Code
def actor(pos1,pos2,pos3,bitmask,settag,model): #функция загрузки актеров
  actor=loader.loadModel(model) #модель актера
  actor.reparentTo(render)
  actor.setScale(0.3) #Размер актера
  actor.setPos(pos1,pos2,pos3) #позиция актера
  actor.find("*").node().setIntoCollideMask(BitMask32.bit(bitmask)) #маска актера
  actor.find("*").node().setTag('obj', settag) #Тег актера
   

actor(35,35,loc.terrain.getElevation(35,35)*30,2,str(10),'res/geometry/box')
actor(35,50,loc.terrain.getElevation(35,35)*30,2,str(9),'res/geometry/gnum')


т.е. здесь актер с моделью бокс реагирует на клацанье мышью а с моделью гном нет.

Добавлено (14.11.2011, 12:27)
---------------------------------------------
Починил путем замены

Code

actor.find("*").node().setIntoCollideMask(BitMask32.bit(bitmask)) #маска актера     
  actor.find("*").node().setTag('obj', settag) #Тег актера


Code
actor.find('**/+GeomNode').node().setIntoCollideMask(BitMask32.bit(bitmask)) #маска актера
  actor.find('**/+GeomNode').node().setTag('obj', settag) #Тег актера


Сообщение отредактировал Rivermacaroon0 - Понедельник, 14.11.2011, 11:55
 
ninthДата: Понедельник, 14.11.2011, 15:25 | Сообщение # 238
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Не всё так просто - актёр не является геометрией, а ты ищешь геометрию find('**/+GeomNode'). Самый простой и эффективный способ - повесить вокруг актёра какой-нить Collision Solid и детектить его.
 
AlexbisДата: Понедельник, 14.11.2011, 17:00 | Сообщение # 239
Рядовой
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Всем привет. Хочу задать несколько вопросов.
MMORPG
Как лучше реализовать игровой мир?
И как разделить игровой мир на локации.
Если есть в 3d max 3 локации можно ли слепить их в панде?\
Пример допустим arena online.
Спасибо заранее)
 
serg-kkzДата: Понедельник, 14.11.2011, 18:36 | Сообщение # 240
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Quote (Alexbis)
Как лучше реализовать игровой мир?

Что?
Quote (Alexbis)
И как разделить игровой мир на локации

Э... а, Что?
Quote (Alexbis)
Если есть в 3d max 3 локации можно ли слепить их в панде?

Хм... что под понятием слепить ты подразумеваешь, что?


ООП  -  
 
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
Поиск: