[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Форум Panda3D - по русски » Panda3D » Общие вопросы » Размеры и масштабирование
Размеры и масштабирование
ГинораДата: Среда, 09.11.2011, 20:43 | Сообщение # 16
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
Quote (serg-kkz)
А погляди на это

Да, то, что надо, спасибо.

По тексту - нужна именно обводка.
 
ninthДата: Четверг, 10.11.2011, 01:16 | Сообщение # 17
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Как-то ты не так с углами работал видимо вот вывод консоли (в интерактивном режиме проверял)
Code
>>> b1 = loader.loadModel('box')
>>> b2 = loader.loadModel('box')
>>> b2.setScale(0.5)
>>> b1.getTightBounds()
(Point3(0, 0, 0), Point3(1, 1, 1))
>>> b2.getTightBounds()
(Point3(0, 0, 0), Point3(0.5, 0.5, 0.5))
>>> b1.reparentTo(render)
>>> b1.getTightBounds()
(Point3(0, 0, 0), Point3(1, 1, 1))
>>> b1.setH(45)
>>> b1.getTightBounds()
(Point3(-0.707107, 0, 0), Point3(0.707107, 1.41421, 1))
>>>


В мануале ничего про обводку текста нету. Максимум - тень от текста. Можно попробовать сгенерировать свой шрифт, если очень хочется, но это может оказаться несколько замороченным.
 
ГинораДата: Четверг, 10.11.2011, 02:14 | Сообщение # 18
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
Quote (ninth)
Как-то ты не так с углами работал видимо вот вывод консоли (в интерактивном режиме проверял)

Ну получается вообще странно...
Сделал пример "с нуля" без лишних "деталей" - действительно все нормально, но на рабочем варианте - как писал ранее.
Вот выложил кусочек из рабочего варианта. Цифры не нормальные получаются.
А вот вариант с bb=DirectBoundingBox(box) bb.getMax() работает нормально
Странно это как-то smile
Прикрепления: test.7z (617.4 Kb)
 
ninthДата: Четверг, 10.11.2011, 08:48 | Сообщение # 19
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Дык всё логично. Ты же свои боксы сместил от 0. Так что он тебе всё правильно показывает - реальные координаты углов.
Для проверки можешь посчитать линейные размеры:
Code

c11, c12 = box1.getTightBounds()
c21, c22 = box2.getTightBounds()
print c12 - c11
print c22 - c21
 
ГинораДата: Четверг, 10.11.2011, 12:35 | Сообщение # 20
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
Да уж smile я ведь когда пытался разобраться и вычитать пробовал, и прибавлять, а результата не увидел smile и правда баран wacko
Ну, спасибо, теперь понял smile

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

Добавлено (10.11.2011, 12:35)
---------------------------------------------
О, нашел интересный момент.
Если выставить рендермод для шрифта RMWireframe, то он выводится в виде обводки (в один пиксель).
Code

font2 = loader.loadFont('lucon1.ttf')
font2.setRenderMode(TextFont.RMWireframe)


Так вот: выводим сначала текст шрифтом без RMWireframe, а потом поверх шрифтом с RMWireframe - получаем текст с обводкой smile

Только один интересный момент. Если сделать так:
Code

font1 = loader.loadFont('lucon.ttf')
font2 = loader.loadFont('lucon.ttf')
font2.setRenderMode(TextFont.RMWireframe)

то font1 также становиться RMWireframe
А если в font2 загрузить такой-же шрифт, но с другим именем ('lucon1.ttf'), то все нормально, шрифты получаются разные


Сообщение отредактировал Гинора - Четверг, 10.11.2011, 12:35
 
ninthДата: Четверг, 10.11.2011, 14:08 | Сообщение # 21
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
А есть-таки у шрифта обводка. Только применять setColor после этого не получится - перекрасится всё - и обводка и шрифт.
Code
font = loader.loadFont('arial.ttf', outlineColor = Vec4(1,0,0,1), outlineWidth = 0.5)


Панда "помнит" уже загруженные объекты и при повтороном вызове лоадера с тем же именем/путём объекта - берёт его из памяти.
 
ГинораДата: Четверг, 10.11.2011, 14:32 | Сообщение # 22
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
То, что повторно loader не грузит модель или шрифт с диска, а берет из памяти я понимаю.
Но мы грузим шрифт в две разные переменные и режим рендера меняем только у одной.
По факту получается что повторный loader.loadFont не создает отдельный объект в памяти и возвращает ссылку, а дает ссылку на первый, ранее загруженный.

В ситуации с loader.loadModel создается новый экземпляр объекта (с диска или копия из памяти - не важно)
и в примере ниже box1 не становится в 2 раза меньше.
box1=loader.loadModel('box_1x1x1')
box2=loader.loadModel('box_1x1x1')
box2.setScale(0.5)

За обводку через loader спасибо )


Сообщение отредактировал Гинора - Четверг, 10.11.2011, 14:35
 
serg-kkzДата: Четверг, 10.11.2011, 15:20 | Сообщение # 23
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Quote (Гинора)
В ситуации с loader.loadModel создается новый экземпляр объекта (с диска или копия из памяти - не важно) и в примере ниже box1 не становится в 2 раза меньше. box1=loader.loadModel('box_1x1x1') box2=loader.loadModel('box_1x1x1') box2.setScale(0.5)


Можно так:

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

box1=loader.loadModel('box')  
box1.setPos(0, -2, 0)

box2=loader.loadModel('box')  
box2.setPos(-2, 0, 0)
box2.reparentTo(box1)

box1.reparentTo(render)

def Key():
     box1.setScale(0.5)
      
base.accept("space", Key) # Тык пробел

run()


Но смещаться при масштабировании будет относительно позиции родителя, т.е. box1

Если у копии другое имя, это не одно и тоже. Даже если задать одинаковые именна, то у них будет разное имя.


ООП  -  
 
ГинораДата: Четверг, 10.11.2011, 16:38 | Сообщение # 24
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
serg-kkz, не про то разговор smile

Quote (serg-kkz)
Если у копии другое имя, это не одно и тоже

Для шрифта это как раз не так.

Я говорил про разное поведение методов класса loader
метод loadFont возвращает указатель на ранее загруженный такой-же объект не создавая нового объекта, а метод loadModel создает новый и передает на него указатель (даже если такой-же объект уже ранее загружен и в памяти).
Это не критично, просто обратил внимание на разное поведение методов одного объекта loader.

В моем посте #22 вопроса не было.


Сообщение отредактировал Гинора - Четверг, 10.11.2011, 16:40
 
serg-kkzДата: Четверг, 10.11.2011, 17:43 | Сообщение # 25
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Quote (Гинора)
Я говорил про разное поведение методов класса loader

A... Ну, дык кто бы мог подумать, что один и тот же шрифт понадобиться загружать несколько раз. Такую ситуацию даже трудно представить. А с моделями и текстурами, звуки и т.д. понятно, они используются часто.

Quote (Гинора)
В моем посте #22 вопроса не было.

Как-то на автопилоте ответил. Раздел: Общие вопросы, Тема: Размеры и масштабирование.


ООП  -  
 
ninthДата: Пятница, 11.11.2011, 00:14 | Сообщение # 26
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Можно попробовать установить renderMode сразу во время загрузки - так же как параметры обводки ('arial.ttf', renderMode = ...) - может так сработает? Сейчас мне не на чем это проверить.
 
ГинораДата: Пятница, 11.11.2011, 00:35 | Сообщение # 27
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
Проверил, renderMode действительно можно указать в параметрах загрузки, но результат тот-же: если грузить несколько TextFont с одного файла - в памяти только один объект.
 
ninthДата: Пятница, 11.11.2011, 09:51 | Сообщение # 28
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Ога. Попробую спросить на оффоруме.
 
ninthДата: Пятница, 11.11.2011, 11:16 | Сообщение # 29
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
----- Решение проблемы -----
Перед повторной загрузкой шрифта надо выполнить FontPool.releaseFont('your_font.ttf')
 
ГинораДата: Пятница, 11.11.2011, 19:47 | Сообщение # 30
Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
О, спасибо )
 
Форум Panda3D - по русски » Panda3D » Общие вопросы » Размеры и масштабирование
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: