Render.ru
Поддержать

движение объектов, вертексов вдоль оси просмотра камеры

AEplug

Мастер
Рейтинг
467
Есть объект, есть камера, двигаем объект таким образом, что в камере он выглядит то приближающимся, то удаляющимся, но его центр в кадре не меняется. Особенно интересно для точек/фейсов.
(на рисунке объекты перемещены вдоль выделеного луча из центра камеры)

каким образом это можно осуществить при редактировании? вопрос анимации не стоит

Вложения

igorznag

Мастер
Рейтинг
103
Особенно интересно для точек/фейсов.
каким образом это можно осуществить при редактировании?
Используйте скрипт TwoPointCoordinateSystem. http://alexcooper.nm.ru/maxscripts.htm
1. Включаем привязки (Snaps) Pivot, Vertex, Edge, Face.
Включаем кнопку Snaps Toggle.
2. Запускаем скрипт, нажимая комбинацию клавиш.
3. Выбираем 2 точки в пространстве.
Первая точка это вершина (Vertex).
Второя точка это опорная точка камеры (Pivot).
4. Выключаем кнопку Snaps Toggle. Включаем кнопку Select and Move.

AEplug

Мастер
Рейтинг
467
вообщем да, но надо настраивать под каждую точку и практически нереально проворачивать эту процедуру каждый раз, когда двигаешь вертексы
прикрутить б автоматизацию на автовыбор центра выбранного объекта и заранее указанной камеры
тогда с хоткеем еще можно было б пользоваться

AEplug

Мастер
Рейтинг
467
pt1 = pickpoint snap:#3d
pt2 = pickpoint snap:#3d rubberband:pt1
как бы вот место, где прописываются координаты
может кто знает как пт1 заменить на "текущее выделение" объект/вертекс
а пт2 на камеру с именем например projection

iVAt

Знаток
Рейтинг
79
а разве PathConstrain по линии не подходит?

iVAt

Знаток
Рейтинг
79
по пути-сплайну, один конец сплайна выравниваем по камере, второй куда нужно и по нему пускаем объект

AEplug

Мастер
Рейтинг
467
а кто будет выравнивать второй конец линии по лучу камера-объект? кто будет заниматься привязкой всех вертексов объекта в линиям? это сколько же таких линий нужно то будет

igorznag

Мастер
Рейтинг
103
может кто знает как пт1 заменить на "текущее выделение" объект/вертекс
а пт2 на камеру с именем например projection
Код:
pt1 = pickpoint snap:#3d
заменяем на код:
pt1=undefined
if(selection.count==1)then
(
if(subObjectLevel==1)then
(
cur_obj=modPanel.getCurrentObject()
if(classof cur_obj==Editable_Poly)then
(
vs=(polyOp.getVertSelection cur_obj)as array
if vs.count==1 then pt1=polyop.getVert cur_obj vs[1] node:selection[1]
)--if(classof subObjectLevel==Editable_Poly)then
)--if(subObjectLevel==1)then
else  pt1=selection[1].pos--if(subObjectLevel==1)then
)--if(selection.count==1)then
Код:
pt2 = pickpoint snap:#3d rubberband:pt1
заменяем на код:
pt2=undefined
cameras_projection=getNodeByName "projection" all:true
for i=1 to cameras_projection.count do
if superclassof cameras_projection[i]==camera then 
(pt2=cameras_projection[i].pos;exit;)
Нужно выделить только один вертекс базового объекта Editable Poly.
Нужно выделить только один объект.
Название камеры должно быть "projection".

AEplug

Мастер
Рейтинг
467
Спасибо вроде все пашет!!!
а чего камера так сложно выбирается?
pt2 = $projection.position
так не проще?

INCUS

Знаток
Рейтинг
29
Ды возьмите вы просто линию с двумя вертексами, и накиньте на неё модификатор Spline Ik Control.
Сгенерируйте в нём две пустышки, по одной на вертекс, и всё....
Их можно линковать..

AEplug

Мастер
Рейтинг
467
Сгенерируйте в нём две пустышки, по одной на вертекс
ерунда какая то - две, но по одной!
прежде чем давать все эти теоретические советы попробовали бы сами сначала

INCUS

Знаток
Рейтинг
29
Всего, их (пустышек - контролов) будет две. Потому что у сплайна два вертекса (corner).
У каждого вертекса по одной пустышке.
Одна пустышка у одного вертекса, а другая пустышка у другого.
Каждая пустышка контролирует свой вертекс.
Поскольку , если, у линии всего два вертекса, то они (эти вертексы) будут находиться на концах линии.( в начале и в конце)
Те пустышки, которые будут контролировать свои вертексы, тоже будут находиться в позиции своих вертексов, т.е, тоже на концах линии.
Пустышки можно линковать, хоть к камере, хоть к её цели..
------------------
Пробовать мне нать, я и так знаю, как это работает.

AEplug

Мастер
Рейтинг
467
так мне не надо линковать вертексы никуда, мне их (вертексы объектов или сами объекты) двигать надо вдоль луча камеры - лучи у камеры идут от центра камеры к краям FOV изображения (по типа как рэйтрасе щитается)

INCUS

Знаток
Рейтинг
29
Так, я пробую понимать, но сделать это до конца я не обещаю.
А Вас устроит, если, глядя из камеры, Вы будете перемещать вон тот малиновый поинт, и ставить его в нужное положение.
У него на вращении Лук Ат, а напозиции лимиты, и он прилинкован к зелёному прямоугольнику, равного по габаритам обзору камеры ?
Поместил поинт, выделил объект и переместил его в координатной системе поинта....прям не выходя из камеры, крутёлками внизу...

Вложения

AEplug

Мастер
Рейтинг
467
мне нужно. что б розовый бокс как раз не двигался в плоскости зеленого прямоугольника, а лишь по оси Х, которая всегда смотрит в камеру.
про lookat я и сам знаю, но как его применить к куче вертексов? можно?

Leonidych

Мастер
Рейтинг
82
mike2003 но как его применить к куче вертексов? можно?
Выделяем вершины>Мод Linked XForm>указываем объект, скажем пустышку, ну а ей уже нужный контроллер.

AEplug

Мастер
Рейтинг
467
все таки скрипт выше лучше работает - проще, без лишнего мусора в сцене и объекты продолжают двигаться и поворачиваться как и прежде без всяких привязок к камере или каким другим объектам
единственное надо каждый раз кнопку нажимать, для нового выделения

igorznag

Мастер
Рейтинг
103
единственное надо каждый раз кнопку нажимать, для нового выделения
Попробуйте такой вариант. Пример:
1. В новой сцене создаем несколько объектов и камеру "projection".
2. Запускаем скрипт.
3. Выделяем нужные объекты или подобъекты Vertex.
4. Чтобы отключить, нажимаем кнопку Stop.
5. Чтобы обновить, нажимаем кнопку Refresh.
Кнопку Refresh нужно нажать если:
1. создать новые объекты.
2. перейти от подобъектов Vertex к выделенному объекту.
3. открыть другую сцену и в других случаях.
try (destroyDialog igorznag_tpcs_ch) catch()
rollout igorznag_tpcs_ch "TPCS" width:130 height:30
(
-- GUI
--------
button btn_refresh "Refresh" pos:[10,5]
button btn_stop "Stop" pos:[80,5]
-- Functions
-----------------
fn localMatrix p1 p2 p3 = (
  		v1 = normalize (p2 - p1)
		v3 = normalize (cross v1 (normalize (p3 - p1)))
		v2 = normalize (cross v3 v1)
		return matrix3 v1 v2 v3 p1
)--fn localMatrix p1 p2 p3 = (

fn coordplane mytrans =(
plane name:"coord_plane" length:0 width:0 lengthsegs:1 widthsegs:1 transform:mytrans
$coord_plane.renderable = off
freeze $coord_plane
hide $coord_plane
)--fn coordplane mytrans =(

fn create_tpcs=
(
try delete $coord_plane
catch ()

pt1=undefined
if(selection.count==1)then
(
if(subObjectLevel==1)then
(
cur_obj=modPanel.getCurrentObject()
if(classof cur_obj==Editable_Poly)then
(
vs=(polyOp.getVertSelection cur_obj)as array
if vs.count==1 then pt1=polyop.getVert cur_obj vs[1] node:selection[1]
)--if(classof subObjectLevel==Editable_Poly)then
)--if(subObjectLevel==1)then
else pt1=selection[1].pos --if(subObjectLevel==1)then
)--if(selection.count==1)then
 

if classof pt1 == point3 then
(
pt2=undefined
cameras_projection=getNodeByName "projection" all:true
for i=1 to cameras_projection.count do
if superclassof cameras_projection[i]==camera then 
(pt2=cameras_projection[i].pos;exit;print"da")
if classof pt2 == point3 then
(
pt3 = [(pt2.x),(pt2.y+10),(pt2.z)]
mymatrix = localMatrix pt1 pt2 pt3
coordplane mymatrix
toolmode.coordsys $coord_plane
try $coord_plane.parent = $ catch()
)--if classof pt2 == point3 then
)--if classof pt1 == point3 then
)--fn create_tpcs=
-- Event Handlers
-------------------
on btn_stop pressed do (deleteAllChangeHandlers id:#igorznag_tpcs;toolmode.coordsys #view)
on igorznag_tpcs_ch open do igorznag_tpcs_ch.btn_refresh.pressed()
on btn_refresh pressed do
(
create_tpcs()
deleteAllChangeHandlers id:#igorznag_tpcs 
when select $objects changes id:#igorznag_tpcs do create_tpcs()
)--on btn_refresh pressed do

);createDialog igorznag_tpcs_ch style:#(#style_minimizebox,#style_titlebar,#style_sysmenu)
P.S. Создайте копию сцены перед тем, как использовать скрипт.