пятница, 20 февраля 2015 г.

Несколько способов выставить правильный масштаб спутниковой карте в сцене 3ds max.

1.Если нужен небольшой кусок карты, то можно просто сделать сриншот с яндекса с линейкой по диагонали:
В максе (не забываем применить BitmapFit для UVW map) рисуем сплайн от начала до конца красной линии на карте.
Важный момент, - линкуем карту к сплайну.
Далее открываем New Floater в Measure, также Scale Transform Type-In и подбираем нужный масштаб сплайну, таким образом, чтобы значение Length совпало со значением на карте:
2.Если же нужен большой участок карты с высоким разрешением, удобно воспользоваться программой SAS Planet. http://sasgis.ru/sasplaneta/
Выделяем нужную область, указываем путь, выставляем нужный масштаб (19 обычно достаточно), склеиваем.
Размер нашей карты получился 4353х2805.
Осталось померить длину ширины прямоугольной области:
 Получилось 1 км 462,84 м
В максе создаем Plane с такими же размерами по ширине и высоте, назначаем материал с картой.
Далее для подгонки масштаба можно воспользоваться вышеизложенным способом, а можно новый масштаб вычилисть с помощью пропорции (для системных юнитов - см):
Неизвестный масштаб = (1462,84 *100*100)/4353 = 3360,5329657707328279347576384103
Осталось только скопировать это значение в поле Offset:World (Scale Transform Type-In):
Результат


понедельник, 16 февраля 2015 г.

Перетасовка объектов.


Иногда необходимо перетасовать объекты в сцене произвольным порядком. Один из способов - это воспользоваться скриптом:

--------------------------------------
(
arSel = selection as array

theNum = arSel.count

if theNum != 0 do
(
    for i = 1 to theNum do
    (
            a1 = arSel[i]
            b1 = arSel[random 1 theNum]
            a1_t = a1.transform
            b1_t = b1.transform
            a1.transform = b1_t
            b1.transform = a1_t
        )
    )
)

--------------------------------------

Пошаговые комментарии:
 "arSel = selection as array" -  строчка создает массив с выделенными объектами.

 "theNum = arSel.count" - число элементов массива

В цикле for возьмём i-ый объект и присвоим его переменной a1, затем произвольный объект присвом переменной b1
"a1 = arSel[i]"
 "b1 = arSel[random 1 theNum]"
 Затем запишем их трансформации в переменные a1_t и b1_t, соответственно
"a1_t = a1.transform"
"b1_t = b1.transform
Осталось поменять объекты местами
"a1.transform = b1_t"
"b1.transform = a1_t"

Чтобы выполнить скрипт, необходимо нажать Ctrl+E
Тут можно посмотреть пример: https://www.youtube.com/watch?v=AQNNG5aObbQ 

четверг, 5 февраля 2015 г.

Способ рандомизации мапинга (текстурных координат) с помощью maxscript.


В моём случае имеется мягкая кровля. На нее уже назначен стандартный мапинг.
Часть кровли выполнен единой геометрией
 Для начала необходимо разбить этот кусок кровли на элементы:

Далее выделяем все элементы и выполняет небольшой скрипт (выполнить скрипт - ctrl+E):
Результат применения скрипта

Скрипт (идея и реализация - Павел Я.):
------------------------------------------------------------------------
for i in selection do
(
local theMod = UVW_Xform ()
 addModifier i theMod
 theMod.U_Offset = random -1000.0 1000.0
 theMod.V_Offset = random -1000.0 1000.0
 theMod.W_Offset = random -1000.0 1000.0
)

 ------------------------------------------------------------------------

Скрипт каждому выделенному объекту назначает модификатор UVW Xform с произвольным смещением по всем осям от -1000 до 1000

Недостатком метода является работа только с отдельными неинстансными объектами.

вторник, 3 февраля 2015 г.

Удаление объектов в произвольном порядке посредством maxscript.


1. Выделим объекты, которые нужно проредить.
2. Создадим и выполним новый скрипт: for i in selection where (random 0 1) == 1 do delete i
Для выполнения скрипта необходимо нажать сочетание клавиш ctrl+E
Это результат
Есть один ньюанс. Чтобы не попасть на долгое выполнение скрипта, необходимо выполнять скрипт при неактивной закладке modify.

В данном случае удаляется 50% объектов. Если необходимо варьировать этот процент, то можно поменять часть кода:
(random 0 2) == 1 - удаляется каждый третий объект, т.е. 30%
(random 0 10) == 1 - удаляется каждый десятый объект, т.е. 10% и т.д.