Realizacja prostej gry polegającej na symulacji jazdy samochodem



Podobne dokumenty
Nagłówek. <link type="text/css" href="styles.css" rel="stylesheet" />

Wprowadzenie do WebGL

Mobilne aplikacje multimedialne. OpenGL

Programowanie gier 3D w HTML5. Andrzej P.Urbański Politechnika Poznańska

Gry Komputerowe Laboratorium 4. Teksturowanie Kolizje obiektów z otoczeniem. mgr inż. Michał Chwesiuk 1/29. Szczecin, r

Programowanie Procesorów Graficznych

Pozycjonowanie i poruszanie warstw

Szybko, prosto i tanio - ale czy na pewno?

Sieciowe Technologie Mobilne. Laboratorium 1

Grafika trójwymiarowa

Nowoczesna OpenGL - rendering wielokątów Rendering wielokątów w kontekście biblioteki SFML

Multimedia i interfejsy. Ćwiczenie 5 HTML5

OpenGL - tekstury Mapowanie tekstur

Wprowadzenie do QT OpenGL

Shadery. Artur Staszczyk Bartłomiej Filipek

Aplikacje WWW - laboratorium

Zaawansowane aplikacje internetowe

Specyfikacja techniczna kreacji HTML5

Responsywne strony WWW

Zdarzenia Zdarzenia onload i onunload

Dokumentacja imapliteapi

Obiekt navigator. Dodał Administrator wtorek, 16 marzec :32

HTML (HyperText Markup Language) hipertekstowy język znaczników

Gry Komputerowe - laboratorium 2. Kamera FPP / TPP. mgr inż. Michał Chwesiuk 1/11. Szczecin, r

plansoft.org Zmiany w Plansoft.org

OpenGL : Oświetlenie. mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski. Szczecin, r 1/23

Ten skrypt powinien zająć 2-3 zajęcia. Trzeba go oddać na trzecim labie.

Potok graficzny i shadery. Hubert Rutkowski

Defilada - przykład wykorzystujący animowane modele Copperlicht. Andrzej P.Urbański Politechnika Poznańska

Przykład integracji kalkulatora mbank RATY na platformie IAI

Gry Komputerowe Interaktywna kamera FPP

APLIKACJE INTERNETOWE 1 HTML - STRUKTURA STRONY INTERNETOWEJ

Dokumentacja Skryptu Mapy ver.1.1

Google Web Toolkit. Piotr Findeisen

Aplikacje WWW - laboratorium

Aplikacje WWW - laboratorium

LIVE Gra w życie. LIVE w JavaScript krok po kroku. ANIMACJA Rozpoczynamy od podstawowego schematu stosowanego w animacji

Biblioteka OpenGL: Wprowadzenie

Podstawy JavaScript ćwiczenia

Podstawy programowania w języku JavaScript

Mapowanie tekstur Mip-mapy (level of detail) Filtrowanie Multiteksturowanie

Laboratorium 6 Tworzenie bloga w Zend Framework

TECHNOLOGIE SIECI WEB

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 6

Kompresja stron internetowych

Podstawy pozycjonowania CSS

CZYM JEST JAVASCRIPT?

Udostępnianie obrazu z kamer Sanyo HD na stronach WWW PORADNIK

Rzutowanie DOROTA SMORAWA

Odsyłacze. Style nagłówkowe

1 Temat: Vertex Shader

JavaScript. Wstęp do podstaw elementów. dr inż. Paweł Boiński, Politechnika Poznańska

Tworzenie Stron Internetowych. odcinek 5

Sieciowe Technologie Mobilne. Laboratorium 2

Zajęcia 4 - Wprowadzenie do Javascript

Elementarne obiekty geometryczne, bufory. Dorota Smorawa

Wprowadzenie do Internetu zajęcia 4

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

1 Wstęp teoretyczny. Temat: Manipulowanie przestrzenią. Grafika komputerowa 3D. Instrukcja laboratoryjna Układ współrzędnych

Sieciowe Technologie Mobilne. Laboratorium 4

Tworzenie Stron Internetowych. odcinek 9

Wprowadzenie do WebGL i Three.js

Spis treści. Wstęp 5 Rozdział 1. Praca z AJAX-em 9. Rozdział 2. Współpraca ze skryptami PHP 55. Rozdział 3. Obsługa formularzy 81

Tworzenie Stron Internetowych. odcinek 10

Specyfikacja techniczna dot. mailingów HTML

Podstawy programowania w języku JavaScript

Zawartość specyfikacji:

HTML. Tim Berners-Lee

Janusz Ganczarski. OpenGL Pierwszy program

FLEX ( ) Przygotowanie środowiska developerskiego Hello world w MXML Hello world w ActionScript

Temat: Wprowadzenie do OpenGL i GLUT

Test z wiedzy informatycznej

How To? Konfiguracja podglądu strumienia z kamer IP ACTi

Studia Podyplomowe Grafika komputerowa i Techniki Multimedialne, 2015, semestr II, dr inż. Robert Banasiak Projektowanie Stron WWW.

HTML (HyperText Markup Language)

Informacje i porady dotyczące pisania shaderów.

Czym jest AJAX. AJAX wprowadzenie. Obiekt XMLHttpRequest (XHR) Niezbędne narzędzia. Standardowy XHR. XHR z obsługą baz danych

Hyper Text Markup Language

INSTRUKCJE REPETYCYJNE PĘTLE

Tablica zawierająca odniesienia do znajdujących się w dokumencie obiektów typu Anchor.

Sierpień 2015 rozwiązanie plik: index.htlm

Układy witryn internetowych

Synteza i obróbka obrazu. Modelowanie obiektów 3D

PROGRAMOWANIE. WNPiD UAM, Programowanie, inż. Piotr Jabłoński

Rysowanie. Rysowanie - podstawy

Opis programu. Obiekt canvas w HTML szerokość i wysokość 600 pikseli. Wygląd dolnej części sterownia armaty grawitacyjnej

Bartłomiej Filipek

Aplikacje internetowe

Celem ćwiczenia jest zapoznanie z językiem HTML i JavaScript, zasadami tworzenia stron WWW i umieszczania na nich skryptów w języku JavaScript.

INSTRUKCJA DO ĆWICZENIA 13. Animacja wielowątkowa w aplikacjach JME. Gra logistyczna.

XML extensible Markup Language. część 5

Tworzenie stron internetowych w kodzie HTML Cz 5

Specyfikacja techniczna formatów reklamowych w serwisach internetowych Wydawnictwa Te-Jot.

Budowa i generowanie planszy

Krótki kurs JavaScript

Wprowadzenie do klas w C++ oraz biblioteki opengl

Temat: Transformacje 3D

2 Przygotował: mgr inż. Maciej Lasota

Zaawansowane aplikacje internetowe laboratorium REST

Laboratorium 1: Szablon strony w HTML5

Transkrypt:

Realizacja prostej gry polegającej na symulacji jazdy samochodem

zadanie Należy zaprogramować symulator jazdy samochodem Sterowany kursorami odpowiadającymi odpowiednio za skręty w lewo i w prawo oraz przyspieszanie i zwalnianie W widoku z góry na płaszczyźnie prostokąta uniemożliwiającego wydostanie się modelu poza jego boczne krawędzie

Powierzchnia do 3D </script> </head> <body onload="webglstart();"> <canvas id="autko" style="border: none;" width="500" height="500"></canvas> <div id="v"></div><br /> </body> </html>

Inicjalizacja webgl var gl; function initgl(canvas) { try { gl = canvas.getcontext("experimentalwebgl"); gl.viewportwidth = canvas.width; gl.viewportheight = canvas.height; catch (e) { if (!gl) { alert("użyj nowszej przeglądarki typu Chrome lub FireFox"); function webglstart() { var canvas = document.getelementbyid("autko"); initgl(canvas); initshaders(); initbuffers(); inittexture(); gl.clearcolor(0.0, 0.0, 0.0, 1.0); gl.enable(gl.depth_test); document.onkeydown = handlekeydown; document.onkeyup = handlekeyup; tick();

Animowanie w cyklach przez nasłuch klawiatury i każdorazowe rysowanie var lasttime = 0; function animate() { var timenow = new Date().getTime(); if (lasttime!= 0) { var elapsed = timenow - lasttime; if(math.abs(x+(speed * elapsed)/1000.0 * Math.sin(degToRad(-zRot)))<18 lasttime = timenow; function tick() { requestanimframe(tick); handlekeys(); drawscene(); animate(); &&Math.abs(y+(speed * elapsed)/1000.0 * Math.cos(degToRad(-zRot)))<18){ x += (speed * elapsed)/1000.0 * Math.sin(degToRad(-zRot)); y += (speed * elapsed)/1000.0 * Math.cos(degToRad(-zRot));

Pojedyńczy cykl rysowania 3D function drawscene() { document.getelementbyid("v").innerhtml = "speed="+speed+"x="+x+" y="+y+"zrot="+zrot+" z="+z; gl.viewport(0, 0, gl.viewportwidth, gl.viewportheight); gl.clear(gl.color_buffer_bit gl.depth_buffer_bit); mat4.perspective(45, gl.viewportwidth / gl.viewportheight, 0.1, 100.0, pmatrix); mat4.identity(mvmatrix); mat4.translate(mvmatrix, [x, y, z]); mat4.rotate(mvmatrix, degtorad(xrot), [1, 0, 0]); mat4.rotate(mvmatrix, degtorad(yrot), [0, 1, 0]); mat4.rotate(mvmatrix, degtorad(zrot), [0, 0, 1]); gl.bindbuffer(gl.array_buffer, cubevertexpositionbuffer); gl.vertexattribpointer(shaderprogram.vertexpositionattribute, cubevertexpositionbuffer.itemsize, gl.float, false, 0, 0); gl.bindbuffer(gl.array_buffer, cubevertextexturecoordbuffer); gl.vertexattribpointer(shaderprogram.texturecoordattribute, cubevertextexturecoordbuffer.itemsize, gl.float, false, 0, 0); gl.activetexture(gl.texture0); gl.bindtexture(gl.texture_2d, cratetextures[filter]); gl.uniform1i(shaderprogram.sampleruniform, 0); gl.bindbuffer(gl.element_array_buffer, cubevertexindexbuffer); setmatrixuniforms(); gl.drawelements(gl.triangles, cubevertexindexbuffer.numitems, gl.unsigned_short, 0);

Nasze dane graficzne wierzchołki 3D var cubevertexpositionbuffer; var cubevertextexturecoordbuffer; var cubevertexindexbuffer; function initbuffers() { cubevertexpositionbuffer = gl.createbuffer(); gl.bindbuffer(gl.array_buffer, cubevertexpositionbuffer); // Kolejne wierzchołki 3D fakturowanego autka vertices = [ // Front face -1.0, -2.0, 1.0, 1.0, -2.0, 1.0, 1.0, 2.0, 1.0, -1.0, 2.0, 1.0, // Back face -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, // Top face -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, // Bottom face -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, // Right face 1.0, -2.0, -1.0, 1.0, 2.0, -1.0, 1.0, 2.0, 1.0, 1.0, -2.0, 1.0, // Left face -1.0, -2.0, -1.0, -1.0, -2.0, 1.0, -1.0, 2.0, 1.0, -1.0, 2.0, -1.0, ];

Nasze dane graficzne współ. tekstury gl.bufferdata(gl.array_buffer, new Float32Array(vertices), gl.static_draw); cubevertexpositionbuffer.itemsize = 3; cubevertexpositionbuffer.numitems = 24; cubevertextexturecoordbuffer = gl.createbuffer(); gl.bindbuffer(gl.array_buffer, cubevertextexturecoordbuffer); // Kolejne współrzędne czerpane z pliku definiującego teksturę autka var texturecoords = [ // Front face 0.25, 0.0, 0.75, 0.0, 0.75, 1.0, 0.25, 1.0, // Back face 0.0, 0.0, 0.25, 0.0, 0.25, 1.0, 0.0, 1.0, // Top face 0.0, 0.0, 0.25, 0.0, 0.25, 1.0, 0.0, 1.0, // Bottom face 0.75, 1.0, 1.0, 1.0, 1.0, 0.0, 0.75, 0.0, // Right face 0.0, 0.0, 0.0, 1.0, 0.25, 1.0, 0.25, 0.0, // Left face 0.0, 0.0, 0.25, 0.0, 0.25, 1.0, 0.0, 1.0, ];

Nasze dane graficzne kolejne trójkąty gl.bufferdata(gl.array_buffer, new Float32Array(textureCoords), gl.static_draw); cubevertextexturecoordbuffer.itemsize = 2; cubevertextexturecoordbuffer.numitems = 24; cubevertexindexbuffer = gl.createbuffer(); gl.bindbuffer(gl.element_array_buffer, cubevertexindexbuffer); // Kolejne trójkąty składające się na prostokąty var cubevertexindices = [ 0, 1, 2, 0, 2, 3, // Front face 4, 5, 6, 4, 6, 7, // Back face 8, 9, 10, 8, 10, 11, // Top face 12, 13, 14, 12, 14, 15, // Bottom face 16, 17, 18, 16, 18, 19, // Right face 20, 21, 22, 20, 22, 23 // Left face ] gl.bufferdata(gl.element_array_buffer, new Uint16Array(cubeVertexIndices), gl.static_draw); cubevertexindexbuffer.itemsize = 1; cubevertexindexbuffer.numitems = 36;

Obsługa klawiatury var currentlypressedkeys = {; function handlekeydown(event) { currentlypressedkeys[event.keycode] = true; if (String.fromCharCode(event.keyCode) == "F") { filter += 1; if (filter == 3) { filter = 0; function handlekeyup(event) { currentlypressedkeys[event.keycode] = false; function handlekeys() { if (currentlypressedkeys[33]) { // Page Up z -= 0.05; if (currentlypressedkeys[34]) { // Page Down z += 0.05; if (currentlypressedkeys[37]) { // Left cursor key zrot += 1; if (currentlypressedkeys[39]) { // Right cursor key zrot -= 1; if (currentlypressedkeys[38]) { // Up cursor key speed += 1; if (currentlypressedkeys[40]) { // Down cursor key speed -= 1;

Definicje zmiennych ruchu auta <script type="text/javascript"> var xrot = 0; var xspeed = 0; var yrot = 0; var yspeed = 0; var zrot = 0; var speed = 0; var x = 0; var y = 0; var z = -50.0; var filter = 0;

Definicja vertex shadera <script id="shader-vs" type="x-shader/x-vertex"> attribute vec3 avertexposition; attribute vec2 atexturecoord; uniform mat4 umvmatrix; uniform mat4 upmatrix; varying vec2 vtexturecoord; void main(void) { gl_position = upmatrix * umvmatrix * vec4(avertexposition, 1.0); vtexturecoord = atexturecoord; </script>

Definicja fragment shadera <script id="shader-fs" type="x-shader/x-fragment"> #ifdef GL_ES precision highp float; #endif varying vec2 vtexturecoord; uniform sampler2d usampler; void main(void) { gl_fragcolor = texture2d(usampler, vec2(vtexturecoord.s, vtexturecoord.t)); </script>

Biblioteki systemowe <html> <head> <title>symulator jazdy autkiem</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <script type="text/javascript" src="glmatrix- 0.9.5.min.js"></script> <script type="text/javascript" src="webgl-utils.js"></script> <script type="text/javascript" src="shaders.js"></script>