Элементы холста 3D Canvas в Opera.

Недавно Opera опубликовала экспериментальные данные построенные в Opera Labs, с поддержкой элементов видео и видео в SVG. Новая версия Opera 11.10 ,также включает в себя экспериментальный элемент холста 3D Canvas. Для просмотра демо представленных в этой статье вы должны будете скачать новый релиз Opera 11.10 . Новый релиз в настоящее время доступен только для Windows. Версии для Mac и Linux должны быть доступны в ближайшее время.
Новое дополнение к HTML5 является холстом. Холст более или менее точечный рисунок, который можно сделать на использовании JavaScript. Само рисование выполняется в  контексте. Спецификация включает 2D контекст который должен быть реализован и он позволяет браузерам добавлять свои собственные контексты. В этой статье я опишу 3D контекст котрый я добавил, он имеется в недавно выпущенном релизе Opera Labs. Контекст называется Opera -3D и в основном реализован в версиях Opera 3D Canvas. Для тех, кто не знаком с тегом холста здесь ускоренный курс в его использовании.
 1.Добавить <canvas></canvas> tag  теги на вашу страницу
 2.Получить элемент холста из JavaScript с использованием getElementById или нечто подобное.
 3.Call canvas.getContext (<имя>); для получения подробной информации.
 Вот и всё. Если у вас есть контекст в вашем скрипте, вы можете просто посмотерть  функции визуализации.
 Opera -3D контекст .
 3D контекст Opera , в отличие от Mozilla, не прямо отображает OpenGL. Он находится на более абстрактном уровне. Основными причинами этого являются:
 •Это делает его легче для реализации на не-OpenGL платформах (таких как D3D)
 •У той или иной формы обнаруживались доступные столкновения.
 Основная концепция является то, что вы работаете с 3D-моделями. Для создания 3D-моделей, добавте вершину треугольников и, наконец, сделайте для них холст. Это то, как выглядит интерфейс.
 interface CanvasRenderingContextOpera3D { // state void save(); // push state on state stack void restore(); // pop state stack and restore state // scene/frame void beginScene(); // start rendering a new frame void endScene(); // finish rendering of the scene and present the result// transformations void translate(in float x, in float y, in float z); void scale(in float x, in float y, in float z); void rotateX(in float rotation); void rotateY(in float rotation); void rotateZ(in float rotation); // rendering operation void drawTriangle(in float x1, in float y1, in float z1, in float tex_s1, in float tex_t1,  in float x2, in float y2, in float z2, in float tex_s2, in float tex_t2,  in float x3, in float y3, in float z3, in float tex_s3, in float tex_t3); void draw3DModel(in Canvas3DModel model); // create objects CanvasTexture createTexture(in Image img); Canvas3DModel create3DModel(); // collision detection string checkIntersection(in float x, in float y, in float z, in float radius, in Canvas3DModel model); // rendering state attribute CanvasTexture texture; // current texture or null for no texture, default is null attribute string color; // current color, default is transparent black attribute float fov; // field of view of the scene in degrees, default is 45 attribute float nearPlane; // distance to the near clipping plane, default is 0.1 attribute float farPlane; // distance to the far clipping plane, default is 100 attribute string ztest; // "none", "less", "lessequal", "greater", "greaterequal", "equal", "notequal". Default is "lessequal" attribute string blend; // "replace", "add", "srcalpha", "multiply". Default is "replace"}; interface Canvas3DModel { void addVertex(in float x, in float y, in float z, in float s, in float t); void addTriangle(in integer vertex1, in integer vertex2, in integer vertex3);}; interface CanvasTexture{};Пойдем через различные функции в порядке их появления выше: 
 •сохранять и восстанавливать функции сохранения и восстановления текущего состояния рендеринга. Они очень похожи на сохранение и восстановление в 2D контексте.
 •перевод,масштаб и поворот функции изменяет матрицу преобразования. Текущая матрица преобразования преобразует все вершины с 3D Canvas. Это включает в себя объекты Canvas3DModel.
 •BeginScene и EndScene используются для разделения кадра. Холст обновляется только при EndScene. Если это так, то изображение копируется на холсте. На холсте рисуются только команды выпущенные между BeginScene и EndScene.
 •drawTriangle обращает один треугольник. Этот метод, как правило, медленный и не должен использоваться для создания многих треугольников.
 •draw3DModel делает модель ранее созданную с create3DModel на холсте. Эта функция гораздо лучше подходит для визуализации больших партий треугольников.
 •CreateTexture создает текстуру объекта из изображения объекта. Этот метод не сработает, если размеры изображения объекта не в степени двойки (1, 2, 4, 8, 16, 32 и т.д.), с регулярным холстом можно создавать текстуры из изображения (в том числе SVG) или другие полотна.
 •create3DModel создает объект 3DModel, которые могут быть построены (путем добавления вершины и треугольники) из оказываемых сценариев.
 •checkIntersection просто сфера / модель столкновений функции обнаружения. Параметры сферы (центр и радиус) и модели для проверки столкновений с сфере. Функция возвращает точки столкновения, как струна, когда происходит столкновение (точки глубоко проникают в coosen как точки столкновения). Если столкновения не было найденная функция возвращает пустую строку наместо.
 Обнаружение столкновений имеет некоторые ошибки в этой сборке, и я рекомендовал бы вам не использовать её. Мы будем писать больше об обнаружения столкновений, когда они неизменны.
 Пример — вращающийся куб .
 Это первый пример когда-либо написанный для Opera 3D в контексте. Он создаёт модели, добавляет вершины треугольников для куба, а затем делает её с различными преобразованиями. Если вы используете Opera с включенным 3D Canvas, то вы также можете увидеть вращающийся куб в действии. Файлы, используемые для этого примера файл HTML,как показано ниже, и изображение для использования в качестве текстуры (в данном случае operalogo.png).
<canvas id=»canvas» width=»200″ height=»200″>
  Canvas not supported!
</canvas>
<script>
  var canvas;
  var context3d;
  var rotation;
  var texture;
  var cube;
  function render(){
    context3d.beginScene();
    context3d.translate(0,0,-5);
    context3d.rotateY(rotation);
    context3d.rotateX(rotation);
    rotation += 2;
    context3d.color = "white";
    context3d.draw3DModel(cube);
    context3d.endScene();
  }
  function onTick(){
    render();
  }
  function onload(){
    canvas = document.getElementById("canvas");
    context3d = canvas.getContext("opera-3d");
    if (!context3d)
    {
      alert("3d canvas not supported");
      return;
    }
    logo = new Image();
    logo.src = "operalogo.png";
    texture = context3d.createTexture(logo);
    context3d.texture = texture;
    cube = context3d.create3DModel();
    cube.addVertex(-1, 1, 1, 0, 0);
    cube.addVertex(1, 1, 1, 1, 0);
    cube.addVertex(-1, -1, 1, 0, 1);
    cube.addVertex(1, -1, 1, 1, 1);
    cube.addVertex(-1, 1, -1, 1, 1);
    cube.addVertex(1, 1, -1, 0, 1);
    cube.addVertex(-1, -1, -1, 1, 0);
    cube.addVertex(1, -1, -1, 0, 0);
    cube.addTriangle(0,1,2);
    cube.addTriangle(2,1,3);
    cube.addTriangle(4,5,6);
    cube.addTriangle(6,5,7);
    cube.addTriangle(0,4,2);
    cube.addTriangle(2,4,6);
    cube.addTriangle(1,5,3);
    cube.addTriangle(3,5,7);
    cube.addTriangle(0,4,1);
    cube.addTriangle(1,4,5);
    cube.addTriangle(2,6,3);
    cube.addTriangle(3,6,7);
    setInterval(onTick, 10);
  }
  document.onload = onload();
</script>
Более продвинутые методы.
 В приведенном выше примере простой текстурированный куб, который был жёстко прописан в сценарии. Можно сделать гораздо больше, чем используя Opera -3D контекст. Ниже я опишу некоторые методы, которые могут быть использованы для создания более сложных примеров.
 DOM3 загрузка и сохранение. 
 Жёсткое кодирование модели отлично подходит для небольших объектов, так как объекты растут они становится все более и более трудными и жёстко кодироваными в их сценарии. Можно обойти эту проблему путем преобразования модели в формате XML, а затем загружать их в сценарий с помощью DOM3 загружать и сохранять для разбора XML. Вот модифицированная версия вращающегося куба.
 Lightmapping 
 Lightmapping является одним из самых известных способов освещения. Он используется во многих популярных играх, например из серии землетрясения. Принцип состоит в том, что нужно умножить каждый пиксель со светом на значение в этом пикселе. Значение света для каждого пикселя предварительно рассчитано и хранится в текстуре.
 Opera 3d Canvas не имеет ещё мульти-текстурирования, так что не возможно сделать lightmapping в один шаг, но вы можете достичь этого эффекта, выполнив несколько проходов. В первый проход сцена отображается как обычно. Во втором проходе ZTEST устанавливается равным и множества размножаются. Сцена в настоящее время оказывают лайтмап вместо текстур и результат мы видим lightmapped сцены.
 Вот и все! Эта статья дала вам введение в основы использования Opera 3d Canvas. После прочтения всего этого вы должны знать достаточно, чтобы создать какой-нибудь классный демо 3d-холст.

 
  
  Март 22nd, 2011
 Март 22nd, 2011  Данил
 Данил Опубликовано в
 Опубликовано в  :
 : 