SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › OpenGL, C++
В этой теме 0 ответов, 1 участник, последнее обновление Dallon Avery 8 года/лет, 8 мес. назад.
-
АвторСообщения
-
Привет, я тут решил нарисовать с помощью OpenGL часики.
Задумка такая: циферблат и часы нарисовать цилиндрами. Один большой и жёлтый, 12 цилиндров в качестве часов и ещё один в качестве стрелки.
Написал функцию для цилиндра, выглядит так: void drawMainCylinder(float radius, int nofsides, float height) и void drawHourCylinder(float radius, int nofsides, float height) для циферблата и часиков соответственно. По сути, это одна и та же функция, разница в цвете. А расстановка всего этого происходит уже в теле главной функции int main().
Вопрос вот в чём: каждый следующий цилиндр отрисовывается относительно предыдущего. То есть, если один часовой цилиндрик имел glScaled(0.25,0.25,0.25); то следующий будет скейлить от предыдущего ещё glScaled(0.25,0.25,0.25);
В чём касяк то?
Вот код:
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220#include <SFML/Graphics.hpp>#include <SFML/OpenGL.hpp>#include <SFML/Window.hpp>#include <iostream>#include <math.h>using namespace std;#define SC_WIDTH 800#define SC_HEIGHT 600#define REFRESH_RATE 0.01fvoid drawMainCylinder(float radius, int nofsides, float height){float angle = 360.f/(float)nofsides;float x = 0.0f;float y = 0.0f;float z = 0.0f;float theta = 0.0f;const float PI = 3.14159f;//draw top endx = 0.0f;y = height/25;z = 0.0f;//yellow colorglColor3f(0.7,0.7,0.0);glBegin(GL_TRIANGLE_FAN);//set centre of the fanglVertex3f(x,y,z);for(int n = 0; n < nofsides + 1; n++){x = radius* cos((theta/180.f)*PI);z = radius* sin((theta/180.f)*PI);glVertex3f(x,y,z);theta += angle;}glEnd();//draw sides endy = height/25;glBegin(GL_QUAD_STRIP);for(int n = 0; n < nofsides + 1; n++){x = radius * cos((theta/180.f)*PI);z = radius * sin((theta/180.f)*PI);glVertex3f(x,y,z);glVertex3f(x,-y,z);theta +=angle;}glEnd();//draw bottom endx = 0.0f;y = -height/25;z = 0.0f;glBegin(GL_TRIANGLE_FAN);//set centre of the fanglVertex3f(x,y,z);for(int n = 0; n < nofsides + 1; n++){x = radius * cos((theta/180.f)*PI);z = radius * sin((theta/180.f)*PI);glVertex3f(x,y,z);theta +=angle;}glEnd();}void drawHourCylinder(float radius, int nofsides, float height){float angle = 360.f/(float)nofsides;float x = 0.0f;float y = 0.0f;float z = 0.0f;float theta = 0.0f;const float PI = 3.14159f;//draw top endx = 0.0f;y = height/25;z = 0.0f;//colorglColor3f(0.2,0.2,1.0);glBegin(GL_TRIANGLE_FAN);//set centre of the fanglVertex3f(x,y,z);for(int n = 0; n < nofsides + 1; n++){x = radius* cos((theta/180.f)*PI);z = radius* sin((theta/180.f)*PI);glVertex3f(x,y,z);theta += angle;}glEnd();//draw sides endy = height/25;glBegin(GL_QUAD_STRIP);for(int n = 0; n < nofsides + 1; n++){x = radius * cos((theta/180.f)*PI);z = radius * sin((theta/180.f)*PI);glVertex3f(x,y,z);glVertex3f(x,-y,z);theta +=angle;}glEnd();//draw bottom endx = 0.0f;y = -height/25;z = 0.0f;glBegin(GL_TRIANGLE_FAN);//set centre of the fanglVertex3f(x,y,z);for(int n = 0; n < nofsides + 1; n++){x = radius * cos((theta/180.f)*PI);z = radius * sin((theta/180.f)*PI);glVertex3f(x,y,z);theta +=angle;}glEnd();}int main(){sf::Window App(sf::VideoMode(SC_WIDTH, SC_HEIGHT, 32), "CLOCK");sf::Clock clock;//sf::Clock Timer;double seconds = 0.0;const float totateIncrement = 0.5f;float xRotate = 30.f;float yRotate = 10.f;float zRotate = 20.f;//output version of OpenGL to the consolecout <<"OpenGL version: "<<glGetString(GL_VERSION)<<endl;//set color and depth clear valueglClearDepth(1.f);glClearColor(0.2f, 0.2f, 0.2f, 1.0f);// Enable Z-buffer read and writeglEnable(GL_DEPTH_TEST);glDepthMask(GL_TRUE);// Setup a perspective projectionglMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(90.f, 1.f, 1.f, 500.f);// Start game loopwhile (App.isOpen()){// Process eventssf::Event Event;while (App.pollEvent(Event)){// Close window : exitif (Event.type == sf::Event::Closed)App.close();// Escape key : exitif ((Event.type == sf::Event::KeyPressed) && (Event.key.code == sf::Keyboard::Escape))App.close();// Resize event : adjust viewportif (Event.type == sf::Event::Resized)glViewport(0, 0, Event.size.width, Event.size.height);}App.setActive();if(clock.getElapsedTime().asSeconds() > REFRESH_RATE){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//Apply some transformationsglMatrixMode(GL_MODELVIEW);glLoadIdentity();//main clock cylinderglTranslatef(0.f, 0.f, -50.f);glRotatef(yRotate, 0.0, 0.0, 0.0);glRotatef(xRotate, 1.0, 0.0, 0.0);glRotatef(zRotate, 0.0, 0.0, 0.0);glScalef(3.f,3.f,3.f);drawMainCylinder(10.f, 50, 15.0f);/////////////////////////////////////////hour 6glTranslated(0,5,12.7f);glScaled(0.25,0.25,0.25);glRotated(-10,1,0,0);drawHourCylinder(1.f, 10, 15.0f);//hour 12glTranslated(0,5,-2.7f);glScaled(0.25,0.25,0.25);glRotated(-45,1,0,0);drawHourCylinder(1.f, 10, 15.0f);clock.restart();App.display();}}return EXIT_SUCCESS;}P.S: на картинке маленькая точка должна была быть таким же цилиндром как и тот что стоит на “6”.
Вложения:
You must be logged in to view attached files. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.