Render.ru

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

AEplug

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

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

Вложения

igorznag

Мастер
Рейтинг
103
#2
Особенно интересно для точек/фейсов.
каким образом это можно осуществить при редактировании?
Используйте скрипт 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
#3
вообщем да, но надо настраивать под каждую точку и практически нереально проворачивать эту процедуру каждый раз, когда двигаешь вертексы
прикрутить б автоматизацию на автовыбор центра выбранного объекта и заранее указанной камеры
тогда с хоткеем еще можно было б пользоваться
 

AEplug

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

iVAt

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

AEplug

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

igorznag

Мастер
Рейтинг
103
#9
может кто знает как пт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
#10
Спасибо вроде все пашет!!!
а чего камера так сложно выбирается?
Код:
pt2 = $projection.position
так не проще?
 

INCUS

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

INCUS

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

AEplug

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

INCUS

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

Вложения

AEplug

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

AEplug

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

igorznag

Мастер
Рейтинг
103
#19
единственное надо каждый раз кнопку нажимать, для нового выделения
Попробуйте такой вариант. Пример:
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. Создайте копию сцены перед тем, как использовать скрипт.
 
Сверху