Автор Тема: Можно ли через переменную назначить объект?  (Прочитано 476 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Novichok

  • Житель
Re: Можно ли через переменную назначить объект?
« Ответ #15 : 13 Октябрь 2018, 10:39:24 »
Уважаемые знатоки Blender, если этот ликбез (тема) ещё не совсем надоел, то я заметил свой промах (промах ли?).
Свойства "Left", "Bottom", "Right", "Top" определены мною только для камеры "CameraObzora".
Однако в скрипте "View" в консоли пишется:
29 camObz =  Camera
35 W =  13.67  int(camObz[Bottom] * H) =  537
36 int(camObz[Left] * W) =  1011  int(camObz[Bottom] * H) =  537
37 int(camObz[Right] * W) =  1353  int(camObz[Top] * H) =  719
У объекта "Camera" ведь нет свойств, но Blender не сообщает об ошибке, а выдаёт данные объекта "CameraObzora". Как это может быть? Я, что, в 32-ой строке создаю эти свойства для объекта "Camera"?
32 camObz.setViewport(int(camObz["Left"] * W), int(camObz["Bottom"] * H), int(camObz["Right"] * W), int(camObz["Top"] * H))

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Можно ли через переменную назначить объект?
« Ответ #16 : 14 Октябрь 2018, 19:44:17 »
... если происходит обращение к несуществующим элементам, то должно быть сообщение об ошибке ...
... проверьте значения элементов перед вызовом функции ...

Оффлайн Novichok

  • Житель
Re: Можно ли через переменную назначить объект?
« Ответ #17 : 15 Октябрь 2018, 10:22:59 »
... если происходит обращение к несуществующим элементам, то должно быть сообщение об ошибке ...
Николай, я в своём Ответе #9 от 10 Октябрь 2018, 21:40:08 дал ссылку на файл в котором игровые свойства назначены только для камеры "CameraObzora" - у других камер их нет. Вы вполне можете убедиться в этом.
Цитировать
... проверьте значения элементов перед вызовом функции ...
Извините, но я не понял подсказку.

На данный момент назначил игровые свойства для всех камер, однако чудеса продолжаются.
В скрипте Start в 19-ой строке поочерёдно назначаю камеры "CameraObzora", "CameraLeft", "CameraRight", "Camera" для дополнительного окна. Для всех окон в консоли выводится одна и та же запись параметров вывода окна:
35 int(camObz[Left] * W) =  842  int(camObz[Bottom] * H) =  339
36 int(camObz[Right] * W) =  1127  int(camObz[Top] * H) =  615
Однако вывод на самом деле различен (см. рисунок).
Камера "CameraObzora" (изображение в левом верхнем углу) даёт правильный вид, а остальные три камеры почему-то уменьшают дополнительное окно, но сообщают о нормальном его выводе.
Николай, как думаете, что может быть причиной, то правильного вывода окна, то уменьшенного?

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Можно ли через переменную назначить объект?
« Ответ #18 : 15 Октябрь 2018, 19:54:02 »
>> в котором игровые свойства назначены только для камеры "CameraObzora" - у других камер их нет. Вы вполне можете убедиться в этом.
... предполагаю что где-то в этом коде ...
import bge                                      # импортируем модуль BGE
from bge import logic                         # импортировать logic из модуля bge
import math                                     # импортируем модуль Math
from mathutils import Vector                    # из модуля mathutils импортировать Vector 

print("!!!!!!!!!!! Start ")
scene = bge.logic.getCurrentScene()             # получить текущую сцену
objList = scene.objects                         # получить список объектов
cont = bge.logic.getCurrentController()     # получить текущий контроллер
car = objList["Car"]                            # получить объект «Car»
camDriv = objList["Camera drivera"]          # получить камеру большого окна с названием Camera drivera

if car["PlayStart"] == False :                  # если старт игры ещё не был выполнен, то ...
    scene.active_camera = camDriv        # активировать как камеру большого окна Camera drivera
    camObz = objList["CameraObzora"]     # получить камеру CameraObzora для дополнительного окна из objList
    camLeft = objList["CameraLeft"]         # получить камеру CameraLeft для дополнительного окна
    camRight = objList["CameraRight"]     # получить камеру CameraRight для дополнительного окна
    cam = objList["Camera"]                 # получить камеру  преследования Camera для дополнительного окна
    car["cameraObz"] = camObz                   # сохранить в свойство cameraObz значение camObz
    print("PlayStart == False camObz = ", camObz)
    logic.globalDict['Time'] = 0                # получить в глобальную переменную Time значение 0
    logic.globalDict['StartTime'] = 0           # запомнить время старта
    logic.globalDict['StPos'] = Vector((0,0,0)) # запомнить стартовую позицию авто
    logic.globalDict['StOr'] = Vector((0,0,0))  # запомнить стартовую ориентацию авто
    logic.globalDict['VecCar'] = Vector((0,0,1))# получить в глобальную переменную вектора vecCar значение 0,0,1
    W = bge.render.getWindowWidth() / 100     # получить Ширину окна
    H = bge.render.getWindowHeight() / 100     # получить Высоту окна
    Wmax = bge.render.getWindowWidth()         # получить максимальную Ширину окна
    Hmax = bge.render.getWindowHeight()         # получить максимальную Высоту окна
    param = camObz["Left"]                      # получить значение переменной param из объекта свойства obj["Left"]
    if param == 0:                              # если param = 0, то ...
        camObz["Left"] = int((Wmax-2)/W*0.75)   # присвоить свойству camObz["Left"] целочисленное значение int((Wmax-2)/W*0.75)
        camLeft["Left"] = camObz["Left"] # присвоить камере CameraLeft то же значение
        camRight["Left"] = camObz["Left"] # присвоить камере CameraRight то же значение
        cam["Left"] = camObz["Left"]     # присвоить камере Camera то же значение
        print("36 camObz[Left] = ", camObz["Left"], " camLeft[Left] = ", camLeft["Left"], " camRight[Left] = ", camRight["Left"], " cam[Left] = ", cam["Left"])
    param = camObz["Right"]                     # получить значение переменной param из объекта свойства camObz["Right"]
    if param == 0:                              # если param = 0, то ...
        camObz["Right"] = int((Wmax-2)/W)       # присвоить свойству camObz["Right"] целочисленное значение int((Wmax-2)/W)
        camLeft["Right"] = camObz["Right"] # присвоить камере CameraLeft то же значение
        camRight["Right"] = camObz["Right"] # присвоить камере CameraRight то же значение
        cam["Right"] = camObz["Right"]     # присвоить камере Camera то же значение
        print("43 camObz[Right] = ", camObz["Right"], " camLeft[Right] = ", camLeft["Right"], " camRight[Right] = ", camRight["Right"], " cam[Right] = ", cam["Right"])
    param = camObz["Bottom"]                    # получить значение переменной param из объекта свойства camObz["Bottom"]
    if param == 0:                              # если param = 0, то ...
        camObz["Bottom"] = int((Hmax-2)/H*0.75) # присвоить свойству camObz["Bottom"] целочисленное значение int((Hmax-2)/H*0.75)
        camLeft["Bottom"] = camObz["Bottom"]    # присвоить камере CameraLeft то же значение
        camRight["Bottom"] = camObz["Bottom"] # присвоить камере CameraRight то же значение
        cam["Bottom"] = camObz["Bottom"] # присвоить камере Camera то же значение
        print("50 camObz[Bottom] = ", camObz["Bottom"], " camLeft[Bottom] = ", camLeft["Bottom"], " camRight[Bottom] = ", camRight["Bottom"], " cam[Bottom] = ", cam["Bottom"])
    param = camObz["Top"]                       # получить значение переменной param * H из объекта свойства camObz["Top"]
    if param == 0:                              # если param = 0, то ...
        camObz["Top"] = int((Hmax-2)/H)         # присвоить свойству camObz["Top"] целочисленное значение int((Hmax-2)/H)
        camLeft["Top"] = camObz["Top"]     # присвоить камере CameraLeft то же значение
        camRight["Top"] = camObz["Top"]     # присвоить камере CameraRight то же значение
        cam["Top"] = camObz["Top"]         # присвоить камере Camera то же значение
        print("57 camObz[Top] = ", camObz["Top"], " camLeft[Top] = ", camLeft["Top"], " camRight[Top] = ", camRight["Top"], " cam[Top] = ", cam["Top"])
    param = camObz["Focus"]                     # получить значение переменной param * H из объекта свойства camObz["Top"]
    if param == 150:                            # если param = 0, то ...
        camObz["Focus"] = int(100)              # присвоить свойству camObz["Focus"] целочисленное значение int(100)
        camLeft["Focus"] = camObz["Focus"] # присвоить камере CameraLeft то же значение
        camRight["Focus"] = camObz["Focus"] # присвоить камере CameraRight то же значение
        cam["Focus"] = camObz["Focus"]     # присвоить камере Camera то же значение
        print("66 camObz[Focus] = ", camObz["Focus"], " camLeft[Focus] = ", camLeft["Focus"], " camRight[Focus] = ", camRight["Focus"], " cam[Focus] = ", cam["Focus"])
    car["PlayStart"] = True         # свойству "PlayStart" присвоить значение True означающее проведение начальной установки свойств в соответствии с размером экрана

Оффлайн Novichok

  • Житель
Re: Можно ли через переменную назначить объект?
« Ответ #19 : 15 Октябрь 2018, 21:06:16 »
>> в котором игровые свойства назначены только для камеры "CameraObzora" - у других камер их нет. Вы вполне можете убедиться в этом.
... предполагаю что где-то в этом коде ...
import bge                                      # импортируем модуль BGE
from bge import logic                         # импортировать logic из модуля bge
import math                                     # импортируем модуль Math
from mathutils import Vector                    # из модуля mathutils импортировать Vector 

print("!!!!!!!!!!! Start ")
scene = bge.logic.getCurrentScene()             # получить текущую сцену
objList = scene.objects                         # получить список объектов
cont = bge.logic.getCurrentController()     # получить текущий контроллер
car = objList["Car"]                            # получить объект «Car»
camDriv = objList["Camera drivera"]          # получить камеру большого окна с названием Camera drivera

if car["PlayStart"] == False :                  # если старт игры ещё не был выполнен, то ...
    scene.active_camera = camDriv        # активировать как камеру большого окна Camera drivera
    camObz = objList["CameraObzora"]     # получить камеру CameraObzora для дополнительного окна из objList
    camLeft = objList["CameraLeft"]         # получить камеру CameraLeft для дополнительного окна
    camRight = objList["CameraRight"]     # получить камеру CameraRight для дополнительного окна
    cam = objList["Camera"]                 # получить камеру  преследования Camera для дополнительного окна
    car["cameraObz"] = camObz                   # сохранить в свойство cameraObz значение camObz
    print("PlayStart == False camObz = ", camObz)
    logic.globalDict['Time'] = 0                # получить в глобальную переменную Time значение 0
    logic.globalDict['StartTime'] = 0           # запомнить время старта
    logic.globalDict['StPos'] = Vector((0,0,0)) # запомнить стартовую позицию авто
    logic.globalDict['StOr'] = Vector((0,0,0))  # запомнить стартовую ориентацию авто
    logic.globalDict['VecCar'] = Vector((0,0,1))# получить в глобальную переменную вектора vecCar значение 0,0,1
    W = bge.render.getWindowWidth() / 100     # получить Ширину окна
    H = bge.render.getWindowHeight() / 100     # получить Высоту окна
    Wmax = bge.render.getWindowWidth()         # получить максимальную Ширину окна
    Hmax = bge.render.getWindowHeight()         # получить максимальную Высоту окна
    param = camObz["Left"]                      # получить значение переменной param из объекта свойства obj["Left"]
    if param == 0:                              # если param = 0, то ...
        camObz["Left"] = int((Wmax-2)/W*0.75)   # присвоить свойству camObz["Left"] целочисленное значение int((Wmax-2)/W*0.75)
        camLeft["Left"] = camObz["Left"] # присвоить камере CameraLeft то же значение
        camRight["Left"] = camObz["Left"] # присвоить камере CameraRight то же значение
        cam["Left"] = camObz["Left"]     # присвоить камере Camera то же значение
        print("36 camObz[Left] = ", camObz["Left"], " camLeft[Left] = ", camLeft["Left"], " camRight[Left] = ", camRight["Left"], " cam[Left] = ", cam["Left"])
    param = camObz["Right"]                     # получить значение переменной param из объекта свойства camObz["Right"]
    if param == 0:                              # если param = 0, то ...
        camObz["Right"] = int((Wmax-2)/W)       # присвоить свойству camObz["Right"] целочисленное значение int((Wmax-2)/W)
        camLeft["Right"] = camObz["Right"] # присвоить камере CameraLeft то же значение
        camRight["Right"] = camObz["Right"] # присвоить камере CameraRight то же значение
        cam["Right"] = camObz["Right"]     # присвоить камере Camera то же значение
        print("43 camObz[Right] = ", camObz["Right"], " camLeft[Right] = ", camLeft["Right"], " camRight[Right] = ", camRight["Right"], " cam[Right] = ", cam["Right"])
    param = camObz["Bottom"]                    # получить значение переменной param из объекта свойства camObz["Bottom"]
    if param == 0:                              # если param = 0, то ...
        camObz["Bottom"] = int((Hmax-2)/H*0.75) # присвоить свойству camObz["Bottom"] целочисленное значение int((Hmax-2)/H*0.75)
        camLeft["Bottom"] = camObz["Bottom"]    # присвоить камере CameraLeft то же значение
        camRight["Bottom"] = camObz["Bottom"] # присвоить камере CameraRight то же значение
        cam["Bottom"] = camObz["Bottom"] # присвоить камере Camera то же значение
        print("50 camObz[Bottom] = ", camObz["Bottom"], " camLeft[Bottom] = ", camLeft["Bottom"], " camRight[Bottom] = ", camRight["Bottom"], " cam[Bottom] = ", cam["Bottom"])
    param = camObz["Top"]                       # получить значение переменной param * H из объекта свойства camObz["Top"]
    if param == 0:                              # если param = 0, то ...
        camObz["Top"] = int((Hmax-2)/H)         # присвоить свойству camObz["Top"] целочисленное значение int((Hmax-2)/H)
        camLeft["Top"] = camObz["Top"]     # присвоить камере CameraLeft то же значение
        camRight["Top"] = camObz["Top"]     # присвоить камере CameraRight то же значение
        cam["Top"] = camObz["Top"]         # присвоить камере Camera то же значение
        print("57 camObz[Top] = ", camObz["Top"], " camLeft[Top] = ", camLeft["Top"], " camRight[Top] = ", camRight["Top"], " cam[Top] = ", cam["Top"])
    param = camObz["Focus"]                     # получить значение переменной param * H из объекта свойства camObz["Top"]
    if param == 150:                            # если param = 0, то ...
        camObz["Focus"] = int(100)              # присвоить свойству camObz["Focus"] целочисленное значение int(100)
        camLeft["Focus"] = camObz["Focus"] # присвоить камере CameraLeft то же значение
        camRight["Focus"] = camObz["Focus"] # присвоить камере CameraRight то же значение
        cam["Focus"] = camObz["Focus"]     # присвоить камере Camera то же значение
        print("66 camObz[Focus] = ", camObz["Focus"], " camLeft[Focus] = ", camLeft["Focus"], " camRight[Focus] = ", camRight["Focus"], " cam[Focus] = ", cam["Focus"])
    car["PlayStart"] = True         # свойству "PlayStart" присвоить значение True означающее проведение начальной установки свойств в соответствии с размером экрана
Николай, извините, в этом коде что? В этом коде я назначил игровые свойства для остальных камер?
Как пример, с помощью строки:
camRight["Focus"] = int(100)
я могу создать игровое свойство для камеры camRight со значением int(100), вы это хотите сказать?

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Можно ли через переменную назначить объект?
« Ответ #20 : 16 Октябрь 2018, 04:41:38 »
>> Свойства "Left", "Bottom", "Right", "Top" определены мною только для камеры "CameraObzora".
... вроде в этом коде описано присвоение и других свойств Left, Right, Bottom, Top? ...
    if param == 0:                              # если param = 0, то ...
        camObz["Left"] = int((Wmax-2)/W*0.75)   # присвоить свойству camObz["Left"] целочисленное значение int((Wmax-2)/W*0.75)
        camLeft["Left"] = camObz["Left"] # присвоить камере CameraLeft то же значение
        camRight["Left"] = camObz["Left"] # присвоить камере CameraRight то же значение
        cam["Left"] = camObz["Left"]     # присвоить камере Camera то же значение
        print("36 camObz[Left] = ", camObz["Left"], " camLeft[Left] = ", camLeft["Left"], " camRight[Left] = ", camRight["Left"], " cam[Left] = ", cam["Left"])
    param = camObz["Right"]                     # получить значение переменной param из объекта свойства camObz["Right"]
    if param == 0:                              # если param = 0, то ...
        camObz["Right"] = int((Wmax-2)/W)       # присвоить свойству camObz["Right"] целочисленное значение int((Wmax-2)/W)
        camLeft["Right"] = camObz["Right"] # присвоить камере CameraLeft то же значение
        camRight["Right"] = camObz["Right"] # присвоить камере CameraRight то же значение
        cam["Right"] = camObz["Right"]     # присвоить камере Camera то же значение
        print("43 camObz[Right] = ", camObz["Right"], " camLeft[Right] = ", camLeft["Right"], " camRight[Right] = ", camRight["Right"], " cam[Right] = ", cam["Right"])
    param = camObz["Bottom"]                    # получить значение переменной param из объекта свойства camObz["Bottom"]
    if param == 0:                              # если param = 0, то ...
        camObz["Bottom"] = int((Hmax-2)/H*0.75) # присвоить свойству camObz["Bottom"] целочисленное значение int((Hmax-2)/H*0.75)
        camLeft["Bottom"] = camObz["Bottom"]    # присвоить камере CameraLeft то же значение
        camRight["Bottom"] = camObz["Bottom"] # присвоить камере CameraRight то же значение
        cam["Bottom"] = camObz["Bottom"] # присвоить камере Camera то же значение
        print("50 camObz[Bottom] = ", camObz["Bottom"], " camLeft[Bottom] = ", camLeft["Bottom"], " camRight[Bottom] = ", camRight["Bottom"], " cam[Bottom] = ", cam["Bottom"])
    param = camObz["Top"]                       # получить значение переменной param * H из объекта свойства camObz["Top"]
    if param == 0:                              # если param = 0, то ...
        camObz["Top"] = int((Hmax-2)/H)         # присвоить свойству camObz["Top"] целочисленное значение int((Hmax-2)/H)
        camLeft["Top"] = camObz["Top"]     # присвоить камере CameraLeft то же значение
        camRight["Top"] = camObz["Top"]     # присвоить камере CameraRight то же значение
        cam["Top"] = camObz["Top"]         # присвоить камере Camera то же значение
        print("57 camObz[Top] = ", camObz["Top"], " camLeft[Top] = ", camLeft["Top"], " camRight[Top] = ", camRight["Top"], " cam[Top] = ", cam["Top"])
    param = camObz["Focus"]                     # получить значение переменной param * H из объекта свойства camObz["Top"]
   

Оффлайн Novichok

  • Житель
Re: Можно ли через переменную назначить объект?
« Ответ #21 : 16 Октябрь 2018, 09:34:18 »
>> Свойства "Left", "Bottom", "Right", "Top" определены мною только для камеры "CameraObzora".
... вроде в этом коде описано присвоение и других свойств Left, Right, Bottom, Top? ...
Николай, вы не ответили на мой вопрос:
Цитировать
"Как пример, с помощью строки:
camRight["Focus"] = int(100)
я могу создать игровое свойство для камеры camRight со значением int(100), вы это хотите сказать? "
потому я удалил все игровые свойства для всех камер в Редакторе логики в колонке свойств.
В стартовом скрипте прописал свойства для всех камер, как предположил ранее. Запустил движок и, действительно получил изображение дополнительного окна.
Интересное кино получается, для чего в этом случае в Редакторе логики эта морока со свойствами, в чём смысл в ней? Я полагал что здесь объявляются и назначаются свойства, а в скриптах только меняется их значение.
Попутный вопрос, добавление и их определение сенсоров, контроллеров, актуаторов так же возможно в скриптах? Если возможно, то где можно ознакомиться с азами?

Оффлайн Novichok

  • Житель
Re: Можно ли через переменную назначить объект?
« Ответ #22 : 16 Октябрь 2018, 13:08:57 »
И, всё же, в моём ответе 17 я привёл картинку с постоянными значениями вывода дополнительного окна, но почему-то вывод осуществляет скрипт View для разных камер в разные места. Как я понимаю, при одинаковых параметрах вывода и место вывода окна должно быть одно.
Кто-нибудь может поделиться предположением по причине такого явления?
Ссылка на файл: https://my-files.ru/rp3czy

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Можно ли через переменную назначить объект?
« Ответ #23 : 16 Октябрь 2018, 18:36:27 »
>> Николай, вы не ответили на мой вопрос:
... нет ...

Оффлайн Novichok

  • Житель
Re: Можно ли через переменную назначить объект?
« Ответ #24 : 16 Октябрь 2018, 21:19:28 »
>> Николай, вы не ответили на мой вопрос:
... нет ...
На нет и суда нет.

Оффлайн Samovar

  • Житель
Re: Можно ли через переменную назначить объект?
« Ответ #25 : 16 Октябрь 2018, 21:26:08 »
Цитировать
И, всё же, в моём ответе 17

Убедительная просьба, вставлять перекрёстные ссылки на свои сообщения, если вы их упоминаете, чтобы не искать их по номерам...
Допустим так: в моём ответе 17    я в своём Ответе #9
Сделать это  можно так:
« Последнее редактирование: 16 Октябрь 2018, 21:53:21 от Samovar »

Оффлайн Novichok

  • Житель
Re: Можно ли через переменную назначить объект?
« Ответ #26 : 16 Октябрь 2018, 22:58:53 »
Цитировать
И, всё же, в моём ответе 17

Убедительная просьба, вставлять перекрёстные ссылки на свои сообщения, если вы их упоминаете, чтобы не искать их по номерам...
Допустим так: в моём ответе 17    я в своём Ответе #9
Сделать это  можно так:


Хороший выход. Приму к сведению.

 

* По форуму

* Последние вложения


Скачано: 18
Автор: MusaevRamiz
2018-12-13_191934.png
Скачано: 20
Автор: oleg126

Скачано: 14
Автор: MusaevRamiz
untitled.jpg
Скачано: 30
Автор: Samovar
17.jpg
Скачано: 30
Автор: nilsen71