Проблема с приближением камеры

01 сентября 2017 11:20
Написал функцию, делающую плавное приближение камеры к объекту. Камера в режиме TARGET. Выглядит это примерно так:
function zoom( distance, time){
  var cam_obj = m_scenes.get_active_camera();
  var current_distance = m_cam.target_get_distance(cam_obj);
....
  m_time.animate(0, 1.0, time, function(e) { 
...
        var delta_distance=(distance-current_distance)*e+current_distance
        m_cam.target_set_distance(cam_obj,delta_distance);

Проблема в том, что периодически (не понятно от чего зависит) приближение выполняется не плавно, а с поддергиванием (Почти всегда, в большей или меньшей степени). С функцией rotate_camera() модуля camera а так-же target_set_pivot_translation() таких проблем нет.

Отчего это происходит и как можно исправить?
01 сентября 2017 15:09
Прикрепите, пожалуйста, минимальный пример, в котором воспроизводится такое поведение. Посмотрим, в чем может быть дело.
Руководитель проекта | VK | Twitter | Facebook | Linkedin
04 сентября 2017 12:51
Как мне кажется, проблема зависит как-то от сложности сцены, чем сложнее - тем заметнее. Постарался сделать проект без всего лишнего:ссылка

Видео с этой проблемой На замедлении видно, что камера сначала приближается, затем перемещается без отдаления, затем снова отдаляется, такие кадры чередуются

Если загрузить видеокарту по полной, например, рендером, получается вообще треш:еще видео Но даже на 60 FPS проблема заметна
06 сентября 2017 17:09
Поставив в функцию target_set_distance лог:
exports.target_set_distance = function(camobj, distance) {
....
    // +y move backward
    m_trans.move_local(camobj, 0, 0, dist_needed - dist_curr);
    console.log( dist_needed - dist_curr, dist_needed, dist_curr)
....
}

увидел вот такое «замечательное» поведение:
0.24475202916423555 24.061330553648283 23.816578524484047
camera.js:713 -0.002985531451095369 24.303095136192763 24.306080667643858
camera.js:713 0.24445855879496392 24.54456826053044 24.300109701735476
camera.js:713 0.0007275665451444979 24.789757477004887 24.789029910459742
camera.js:713 0.24045552017281935 25.030939143135758 24.790483622962938
camera.js:713 0.0024001074795059196 25.273796693955752 25.271396586476246
camera.js:713 0.23725294153727816 25.513448204500904 25.276195262963626
camera.js:713 0.012307774318468745 25.763009294077413 25.750701519758945
camera.js:713 0.22537703427405376 26.000693461726627 25.775316427452573
camera.js:713 0.019593957348543967 26.245664084545968 26.226070127197424
camera.js:713 0.223557283593113 26.48881309357278 26.265255809979667
camera.js:713 0.020250171180155263 26.73261788356489 26.712367712384737
camera.js:713 0.22384764640497679 26.976714131763813 26.752866485358837
camera.js:713 0.019448220698897956 27.220008869894027 27.20056064919513
camera.js:713 0.22275413399766109 27.46221063974871 27.23945650575105
camera.js:713 0.021707906559004897 27.70667121070614 27.684963304147136
camera.js:713 0.21961826199371615 27.947998605940416 27.7283803439467
camera.js:713 0.0220736616171493 28.1896903239332 28.16761666231605
camera.js:713 0.2209988407701431 28.432766468408303 28.21176762763816
camera.js:713 0.02375494666916822 28.67751849757254 28.65376355090337
camera.js:713 0.22041607355007642 28.921687610323158 28.70127153677308
camera.js:713 0.023898771806805996 29.16600245217719 29.142103680370383
camera.js:713 0.21531733017551247 29.40521677541212 29.18989944523661
camera.js:713 0.023314184772736724 29.643848182233455 29.62053399746072
camera.js:713 -0.021420446748784627 29.645742660577678 29.667163107326463

как видите, камера передвигается то на одну величину, то на другую, в 10 раз меньше… Я было подумал, что это возможно из-за того, что я перемещаю сам pivot камеры, но дело в том, что даже если отключить rotate_camera и target_set_pivot_translation все равно наблюдается тоже самое…

В общем, либо неверно определяется расстояние m_trans.obj_point_distance() либо m_trans.move_local() двигает объект слишком сильно… Вцелом, если сделать следующее:
exports.target_set_distance = function(camobj, distance) {
    if (!m_cam.is_target_camera(camobj)) {
        m_print.error("target_set_distance(): Wrong camera object or camera move style");
        return;
    }

    var dist_curr = m_trans.obj_point_distance(camobj, camobj.render.pivot);
    var dist_needed = Math.max(0, distance);

    // +y move backward
    m_trans.move_local(camobj, 0, 0, (dist_needed - dist_curr)/2 );  // примерно в 2 раза меньше надо двигать... 
  
    m_trans.update_transform(camobj);
    m_phy.sync_transform(camobj);
}

Картинка двигается гооооораздо плавнее. Но, разумеется, не идеально, тк во-первых, сдвиг не совсем в 2 раза больше, чем должен быть, а во-вторых проблема в целом не в этом, а в m_trans.obj_point_distance() либо m_trans.move_local()
14 сентября 2017 16:38
Нашел в чем проблема. Изучил исходники, и нашел, что камера перемещается с помощью transform_vec3, а эта функция учитывает масштаб объекта. Оказывается, камера была отмасштабирована. Причем blender не применяет масштаб на Alt+A у камер и источников света, поэтому я даже не догадывался об этом!
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.