Размеры и масштабирование
|
|
Гинора | Дата: Среда, 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() работает нормально Странно это как-то
|
|
| |
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
| Да уж я ведь когда пытался разобраться и вычитать пробовал, и прибавлять, а результата не увидел и правда баран Ну, спасибо, теперь понял
А по поводу текста, то, что в доке нет про обводку я знаю, вопрос задал т.к. разрабы сделали такую фишку как к примеру разный цвет текста в одной строке, а обводку не сделали (хотя с ней читабельность текста в динамике лучше) и я решил что мож где не документированное есть А шрифт с обводкой я пробовал, но результат не уд. т.к. если текст темный - обводка светлая должна быть, и наоборот, а на одном шрифте так не сделаешь. И какой выход? либо отрисовать, например, сначала черным надписть по кругу с небольшим смещением раз десять, а потом сверху белым по центру этой окружности, или шейдер под это дело?
Добавлено (10.11.2011, 12:35) --------------------------------------------- О, нашел интересный момент. Если выставить рендермод для шрифта RMWireframe, то он выводится в виде обводки (в один пиксель). Code font2 = loader.loadFont('lucon1.ttf') font2.setRenderMode(TextFont.RMWireframe)
Так вот: выводим сначала текст шрифтом без RMWireframe, а потом поверх шрифтом с RMWireframe - получаем текст с обводкой
Только один интересный момент. Если сделать так: 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, не про то разговор
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
| О, спасибо )
|
|
| |