1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Общие вопросы", создана пользователем AEplug, 29 ноя 2012.

Модераторы: Артер
  1. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    Есть объект, есть камера, двигаем объект таким образом, что в камере он выглядит то приближающимся, то удаляющимся, но его центр в кадре не меняется. Особенно интересно для точек/фейсов.
    (на рисунке объекты перемещены вдоль выделеного луча из центра камеры)

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

    Вложения:

    • 2903337.jpg
      2903337.jpg
      Размер файла:
      91,9 КБ
      Просмотров:
      77
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Используйте скрипт 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.
     
  3. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    вообщем да, но надо настраивать под каждую точку и практически нереально проворачивать эту процедуру каждый раз, когда двигаешь вертексы
    прикрутить б автоматизацию на автовыбор центра выбранного объекта и заранее указанной камеры
    тогда с хоткеем еще можно было б пользоваться
     
  4. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    Код:
    pt1 = pickpoint snap:#3d
    pt2 = pickpoint snap:#3d rubberband:pt1
    как бы вот место, где прописываются координаты
    может кто знает как пт1 заменить на "текущее выделение" объект/вертекс
    а пт2 на камеру с именем например projection
     
  5. iVAt

    iVAt Знаток

    С нами с:
    03.08.2006
    Сообщения:
    1.138
    Симпатии:
    1
    Баллы:
    46
    а разве PathConstrain по линии не подходит?
     
  6. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    по какой линии?
     
  7. iVAt

    iVAt Знаток

    С нами с:
    03.08.2006
    Сообщения:
    1.138
    Симпатии:
    1
    Баллы:
    46
    по пути-сплайну, один конец сплайна выравниваем по камере, второй куда нужно и по нему пускаем объект
     
  8. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    а кто будет выравнивать второй конец линии по лучу камера-объект? кто будет заниматься привязкой всех вертексов объекта в линиям? это сколько же таких линий нужно то будет
     
  9. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Код:
    Код:
    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".
     
  10. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    Спасибо вроде все пашет!!!
    а чего камера так сложно выбирается?
    Код:
    pt2 = $projection.position
    так не проще?
     
  11. INCUS

    INCUS Знаток

    С нами с:
    03.08.2010
    Сообщения:
    857
    Симпатии:
    30
    Баллы:
    29
    Ды возьмите вы просто линию с двумя вертексами, и накиньте на неё модификатор Spline Ik Control.
    Сгенерируйте в нём две пустышки, по одной на вертекс, и всё....
    Их можно линковать..
     
  12. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    ерунда какая то - две, но по одной!
    прежде чем давать все эти теоретические советы попробовали бы сами сначала
     
  13. INCUS

    INCUS Знаток

    С нами с:
    03.08.2010
    Сообщения:
    857
    Симпатии:
    30
    Баллы:
    29
    Всего, их (пустышек - контролов) будет две. Потому что у сплайна два вертекса (corner).
    У каждого вертекса по одной пустышке.
    Одна пустышка у одного вертекса, а другая пустышка у другого.
    Каждая пустышка контролирует свой вертекс.
    Поскольку , если, у линии всего два вертекса, то они (эти вертексы) будут находиться на концах линии.( в начале и в конце)
    Те пустышки, которые будут контролировать свои вертексы, тоже будут находиться в позиции своих вертексов, т.е, тоже на концах линии.
    Пустышки можно линковать, хоть к камере, хоть к её цели..
    ------------------
    Пробовать мне нать, я и так знаю, как это работает.
     
  14. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    так мне не надо линковать вертексы никуда, мне их (вертексы объектов или сами объекты) двигать надо вдоль луча камеры - лучи у камеры идут от центра камеры к краям FOV изображения (по типа как рэйтрасе щитается)
     
  15. INCUS

    INCUS Знаток

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

    Вложения:

    • 2903932.jpg
      2903932.jpg
      Размер файла:
      412,9 КБ
      Просмотров:
      77
  16. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    мне нужно. что б розовый бокс как раз не двигался в плоскости зеленого прямоугольника, а лишь по оси Х, которая всегда смотрит в камеру.
    про lookat я и сам знаю, но как его применить к куче вертексов? можно?
     
  17. Leonidych

    Leonidych Мастер

    С нами с:
    17.02.2007
    Сообщения:
    793
    Симпатии:
    9
    Баллы:
    87
    Выделяем вершины>Мод Linked XForm>указываем объект, скажем пустышку, ну а ей уже нужный контроллер.
     
  18. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    все таки скрипт выше лучше работает - проще, без лишнего мусора в сцене и объекты продолжают двигаться и поворачиваться как и прежде без всяких привязок к камере или каким другим объектам
    единственное надо каждый раз кнопку нажимать, для нового выделения
     
  19. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Попробуйте такой вариант. Пример:
    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. Создайте копию сцены перед тем, как использовать скрипт.
     
  20. AEplug

    AEplug Мастер

    С нами с:
    11.05.2005
    Сообщения:
    945
    Симпатии:
    66
    Баллы:
    152
    кажется пашет! спасибо
     
Модераторы: Артер

Поделиться этой страницей