[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Размеры и масштабирование
ГинораДата: Понедельник, 07.11.2011, 12:29 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
День добрый.

Есть пара вопросов:
1. Как получить размер загруженной модели (например, гнома из примера "Детский сад") что бы впоследствии масштабировать модель не "методом тыка"? Вопрос возник в связи с необходимостью установки над головой модели надписи, но т.к. высота модели может быть разной, то и установку надписи удобно делать, зная фактический (до или после масштабирования) размер модели.
Также интересно как узнать размер полученного текста (какая будет надпись заранее не известно). К тексту следует, например, прикрепить картинку слева, а потом все это выровнять по центру.
2. К объекту прикреплен TextNode. Находится он выше модели. При приближении/удалении камеры к/от объекта надпись так же увеличивается/уменьшается. Все это правильно, но надо что бы надпись не масштабировалась, т.е. подпись к объекту должна иметь один размер как на большом удалении камеры, так и при приближении.
Нормального решения к сожалению отыскать не смог, а расчет расстояния до камеры с последующим пересчетом масштаба для каждого такого TextNode в сцене как мне кажется не правильный. Рисовать же на aspect2d не правильно т.к. надпись может перекрываться другими 3d объектами.

Спасибо.


Сообщение отредактировал Гинора - Понедельник, 07.11.2011, 12:30
 
serg-kkzДата: Понедельник, 07.11.2011, 18:10 | Сообщение # 2
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
1. Как получить размеры объекта я где-то здесь на форуме видел решение. Но в твоем случае можно цеплять к кости головы персонажа.
По второй проблеме можно просто посчитать количество символов и сместить картинку.
2. Тебе нужно использовать текст gui, а не TextNode, вот только как его отобразить в позиции 3D объекта, я не знаю. Еще не приходилось голову ломать. А перекрытие надписей друг другом неизбежно в любом случае.


ООП  -  
 
ГинораДата: Понедельник, 07.11.2011, 20:05 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
1. По количеству символов конечно можно.... Но надо знать размер одного, а как? sad Причем вопрос про 3D)
2. Если я правильно понял, то под текстом gui Вы подразумеваете, например, OnscreenText. Добавил его - результат тот же:
Code

ost = OnscreenText(fg=(1,1,1,1), text = '123')
ost.setScale(0.3)
ostnp = obj.root.attachNewNode('111')
ost.reparentTo(ostnp)
ostnp.setPos(0, 0, pZ + 1.5)
ostnp.setBillboardPointEye()
ostnp.setLightOff()

Результат в прикрепленном скрине.
По скрину так же видно, что проблема касается и спрайта с "уровнем". Он так же не должен масштабироваться.
Прикрепления: 3015837.jpg (89.0 Kb)


Сообщение отредактировал Гинора - Понедельник, 07.11.2011, 20:16
 
serg-kkzДата: Понедельник, 07.11.2011, 20:51 | Сообщение # 4
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Я имел ввиду прикреплять к render2d и при появление игрока в камере выводить координаты в экранные. На самом деле он не маштабируется, а перемещается в пространстве. т.к. прикреплен к 3D рендеру.

ООП  -  
 
ГинораДата: Понедельник, 07.11.2011, 21:14 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
Ну да, я не правильно подобрал термин. Конечно, он фактически не масштабируется, а при удалении визуально уменьшается.
Если помещать на render2d, то как его перекрывать объектами, что находятся к камере ближе....
Одним словом, движок не должен менять визуальные размеры объекта (текста, спрайта) в таких случаях. Это же во всех играх присутствует, по идее и в Панде должно быть... вот только как? smile Кстати, ковырял и в рендер атрибутах - не нашел (хотя по логике там). Может плохо искал...
 
ninthДата: Вторник, 08.11.2011, 00:38 | Сообщение # 6
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
1.
pt1,pt2 = np.getTightBounds() получишь углы описанного вокруг твоего np прямоугольного параллелепипеда. Соответственно сможешь выяснить размеры.

textNode имеет методы getWidth() getHeight(), которые вернут размеры отрендеренного текста. Только стоит учитывать, что размеры не масштабированы. Есть ещё более полезная функция getCardActual() - возвращает размеры описанного вокруг текста прямоугольника. Можешь посмотреть исользование здесь http://panda3d.org.ru/forum/5-184-1

2.
Сразу так не подскажу. Лучше будет, если приведёшь скрин с подобным поведением надписей.
 
ГинораДата: Вторник, 08.11.2011, 01:47 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
ninth, огромное спасибо, попробую разобраться с углами.
По п.2 вот скрин из пресловутой линейки.
Размер шрифта никнеймов у всех моделей одинаковый не зависимо от удаленности модели. При этом видно, что более ближние объекты перекрывают более дальние.
Прикрепления: 3988125.jpg (82.1 Kb)


Сообщение отредактировал Гинора - Вторник, 08.11.2011, 01:56
 
ninthДата: Вторник, 08.11.2011, 09:01 | Сообщение # 8
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
На скрине непонятно - перекрываются ли надписи трёхмерными объектами или только другими надписями? Я не линейщик/вовщик, так что не сочти за издевательство )
 
ГинораДата: Вторник, 08.11.2011, 10:26 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
Глянул в вове - действительно не так smile вот еще скрины.
Прикрепления: 5039480.jpg (83.2 Kb) · 2814447.jpg (89.3 Kb)
 
ninthДата: Вторник, 08.11.2011, 15:03 | Сообщение # 10
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Тут или какой-то хитрый просчёт z-буффера, либо таки масштабирование. Аттрибутом рендера это не может быть т.к. уменьшение объекта - эффект "перспективной" линзы камеры, который влияет не на объект как таковой, а на точки в трёхмерном пространстве. Есть "ортографическая" камера, используемая для 2d, которая не изменяет масштаб, но выглядит это всё весьма специфично. Это если на пальцах. Если ближе к телу, то предполагаю, что можно поиграть с матрицей трансформации в плоскость экрана, инвертировав, её компонент, отвечающий за масштаб и применив к твоей надписи. Чуть позже попробую глянуть более подробно на этот счёт.
 
serg-kkzДата: Вторник, 08.11.2011, 19:29 | Сообщение # 11
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Гинора, попробуй, то, не то.
Прикрепления: text.7z (166.0 Kb)


ООП  -  
 
ГинораДата: Вторник, 08.11.2011, 21:30 | Сообщение # 12
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
Да, результат - то что надо, это как раз второй вариант, с масштабированием в зависимости от расстояния объекта до камеры.
Я тоже так сделал, правда через np.getDistance(base.camera), но у тебя "посимпатичней" реализовано smile
Хотя опять-же: это через "одно место" (доп. нагрузка на таск-менеджер), если в движке есть встроенная подобная фича, если нет - думаю достойное решение.
Спасибо
 
ninthДата: Среда, 09.11.2011, 11:51 | Сообщение # 13
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Хм. Так даже проще чем с матрицами развлекаться )
 
ГинораДата: Среда, 09.11.2011, 17:39 | Сообщение # 14
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
Что-то я как баран на новые ворота гляжу на эти углы smile , полученные функцией getTightBounds()
Во первых, для одного и того-же статического объекта (куб) они постоянно незначительно меняются,
во вторых для двух одинаковых объектов с разным масштабом они практически идентичны (разница в "дрожании" из п. 1),
да и вообще, я не пойму с какой стороны к ним подойти smile
Нельзя ли поподробнее, пожалуйста smile
Вот пример: Имеем два куба. В оригинале они имеют размер 1Х1Х1. Помещены в одну точку. Первый без масштабирования, второй - масштаб 0.5
Результат для первого куба: (Point3(19.5, 19, 11.0736), Point3(20.5, 20, 12.0736))
для второго: (Point3(19.75, 19.5, 11.0736), Point3(20.25, 20, 11.5736))
Как узнать их размеры (если заранее не знать что они 1Х1Х1 smile )?

И еще один вопросик возник, правда оффтопик smile как сделать обводку шрифта (текста)? Не обвести фрейм, а именно каждую букву, что бы лучше читался. Пробовал шрифт с обводкой, но при изменении цвета текста, перекрашивается именно обводка.


Сообщение отредактировал Гинора - Среда, 09.11.2011, 17:40
 
serg-kkzДата: Среда, 09.11.2011, 20:26 | Сообщение # 15
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Quote (Гинора)
Что-то я как баран на новые ворота гляжу на эти углы

А погляди на это.

Code
# -*- coding: utf_8 -*-
from direct.directbase import DirectStart  
from direct.directtools.DirectSelection import DirectBoundingBox

box=loader.loadModel("teapot")  
box.reparentTo(render)  
box.setScale(0.5)

bb=DirectBoundingBox(box)  
bb.show() # отобразить BoundingBox

s = box.getScale()
r = bb.getMax()
print r[0]*s[0], r[1]*s[1], r[2]*s[2]
run()


По второму вопросу. А цвет для фрейма установить не судьба, или именно нужна обводка?


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