Как настроить 360-видеопроекцию в as3/away3d, чтобы сохранить наложения прямо
Я пытаюсь создать 360-градусный видеоплеер, который будет более или менее похож на настольный 360-плеер Youtube. Я не 3D-парень, но мне удалось создать что-то с помощью кода, который я нашел в сети. Я использую Away3D 2.5.2 для этого.
Проблема, с которой я столкнулся, заключается в том, что мой клиент вставил в видео некоторые графические наложения. Эти накладки должны оставаться прямыми, по крайней мере, на вертикальной стороне. В то время как проигрыватель Youtube успешно справляется с этой задачей - смотрите здесь: https://www.youtube.com/watch?v=59MVhZWlKgQ - мой собственный плеер немного изгибает вертикальные линии - см. Здесь: http://www.ysection.com/saar/360a/
Само видео находится здесь: http://www.ysection.com/saar/360a/360test2-injected.mp4
* это видео только пример для этого вопроса. Я нашел это на YT, и у меня нет прав на это
Как вы можете видеть на этих скриншотах, в плеере Youtube есть некоторое компенсирующее "рыбий глаз" искажение, применяемое к видео (см. По краям), которое помогает сохранять прямые линии.
Оба игрока воспроизводят одно и то же видео, равное 4096x2048.
Ниже приведен основной кодекс вопроса к вопросу:
Вот как я настроил камеру:
camera = new HoverCamera3D();
camera.steps = 1;
camera.zoom = 15;
camera.focus = 25;
camera.minTiltAngle = -90;
camera.maxTiltAngle = 90;
camera.panAngle = 270;
camera.tiltAngle = 0;
Это настройка материала:
video = new Video(2880,1440);
vBitmap = new BitmapData(2880,1440);
skyMaterial = new BitmapMaterial(vBitmap);
skyMaterial.smooth = true;
Это настройка 3D-объекта:
skysphere = new Sphere();
skysphere.material = skyMaterial;
skysphere.radius = 2800;
skysphere.rotationX = 180;
skysphere.segmentsW = 40;
skysphere.segmentsH = 36;
skysphere.scale(-1);
scene.addChild(skysphere);
и это то, что я имею на ввод кадра:
vBitmap.draw(video,null,null,null,null,true);
if (move) {
camera.panAngle = 0.3 * (lastMouseX - this.mouseX) + lastPanAngle;
camera.tiltAngle = 0.3 * (lastMouseY - this.mouseY) + lastTiltAngle;
}
// hack
camera.panAngle = camera.panAngle+0.001-0.002*int(hackSwitch);
hackSwitch = !hackSwitch;
camera.hover();
view.render();
Ребята, есть ли у вас какой-нибудь совет для меня, как заставить мой плеер вести себя как Youtube?
спасибо Саар
1 ответ
Я должен был бы рассмотреть это подробно позже, но на первый взгляд:
Похоже, что YouTube отображает видео на внутреннюю часть цилиндра с крышкой (т.е. камера привязана к 0,0,0 внутри "капсулы"). Если вы перемещаетесь вверх / вниз с наложениями к краю экрана, вертикальные линии наложения остаются прямыми, наклоненными на величину панорамирования, но прямыми и не вогнутыми. Так как вам разрешено панорамирование вверх / вниз на 180 градусов, если вы панорамируете вниз у ног проводника, вы увидите, что линии сходятся, как если бы они отображались в сферу, но при панорамировании в 0 градусов вы смотрите на текстуру, отображенную на вертикальные "стенки" цилиндра, таким образом, не искажают вертикальные линии наложения.
Вместо трехмерного сопоставления с примитивом сферы в Away3d, попробуйте использовать в качестве быстрого взлома файл away3d.primitives.CapsuleGeometry.
ПРИМЕЧАНИЕ: Google может действительно делать настоящую "прямолинейную Лену" через шейдер webgl клиента, или, может быть, просто отображать ее на прямолинейную сетку (снова отображенную в форме капсулы?), Но иметь неравномерное расстояние между каждым горизонтальным сегментом, чтобы обеспечить этот прямолинейный внешний вид, но я не смотрел на код JS.
ПРИМЕЧАНИЕ. Быстрый тест для проигрывателя YouTube, сопоставьте несколько квадратных наложений рядом с полом и потолком, воспроизведите его и переместите вверх или вниз, чтобы увидеть, где начинаются искажения. Еще лучше, просто наложите линии сетки (например, кирпичную стену) на видео, которые покрывают всю вертикальную высоту и всю горизонтальную ширину видео, и вы сможете "отобразить" тип примитивного объекта, который они используют, с помощью панорамирования вверх и вниз, когда одна из линий повернута на 0, 45 и 90 градусов относительно центра (опять же, я предполагаю, что он покажет цилиндр со сферическими колпачками или прямолинейный куб или сферу с геометрией вершин на основе гномоники / экваториальной плоскости).