Drugi semestr, zaczęliśmy OpenGL, tylko dwa zajęcia, mam taki kod: http://wklej.org/id/1663003/
I takie dwa zadania:
Jaki jest 3 argument dla tej funkcji glutTimerFunc? I jak do tego się zabrać z tym kodem?
Drugi semestr, zaczęliśmy OpenGL, tylko dwa zajęcia, mam taki kod: http://wklej.org/id/1663003/
I takie dwa zadania:
Jaki jest 3 argument dla tej funkcji glutTimerFunc? I jak do tego się zabrać z tym kodem?
spartanPAGE napisał(a):
- Masz w dokumentacji.
- Ot, wystarczy napisać. Trochę programowania, trochę matematyki - kilka mnożeń, parę przekształceń...
Azarien napisał(a):
- Ot, wystarczy napisać. Trochę programowania, trochę matematyki - kilka mnożeń, parę przekształceń...
Oscylację wokół środka można zrobić jako złożenie sinusa w poziomie i w pionie (Najlepiej z innym okresem).
Napisałem 6 zadanie, tylko nie wiem czy o to chodziło, kwadrat przesuwa mi się w środek koła, o to chodziło?
Kod:
//Zmienne i funkcje:
int licznik;
static void timerCallback(int value)
{
if (licznik<50)
{
licznik++;
x -= dx / 50;
y -= dy / 50;
glutPostRedisplay();
glutTimerFunc(100, timerCallback, value);
}
//Kod główny:
case 'p':
dx = x - ox;
dy = y - oy;
licznik = 0;
licznik++;
timerCallback(0);
break;
}
A co do oscylacji, to nie mam pojęcia jak się za to zabrać.
spartanPAGE napisał(a):
Matematyka kolego. @Azarien powiedział jak to uzyskać
Żadna matematyka, tylko trzeba podpowiedzieć jak to zapisać w kodzie, a nie matma... Bo jak wykres sinusa wygląda to wiem, poza tym nie powiedział, że musi oscylować sinusoidalnie, tylko może na boki.
misiakufal_not_logge napisał(a):
nie patrz na wykres sinusa, bo on tutaj nie ma nic do rzeczy. Weź popatrz na to, jakie wartości zwraca ta funkcja. I tak, tutaj chodzi o matematykę, a nie o to jak zapisać to w kodzie. Podstawiaj sobie do sinusa po kolei 1, 2, 3 stopnie itp i sprawdzaj jakie wartości zwraca.
Mam koło siebie tabele i wiem jakie zwraca, a to żeby to w kodzie, to już inna sprawa, chyba nie?
Mam taki kod obecnie, narysowałem trójkąt równoboczny. Jakiej funkcji użyć, żeby przesuwało się to cały czas?
#include "glut.h"
#include "math.h"
float x = 0, y = 0;
void drawCircle(float xc, float yc, float rad)
{
//
// draw a circle centered at (xc,yc) with radius rad
//
glPushMatrix();
glTranslatef(xc, yc, 0);
glBegin(GL_LINE_LOOP);
//
for (int angle = 0; angle<365; angle = angle + 5)
{
float angle_radians = angle * (float)3.14159 / (float)180;
float x = rad * (float)cos(angle_radians);
float y = rad * (float)sin(angle_radians);
glVertex3f(x, y, 0);
}
//
glEnd();
glPopMatrix();
}
void display(void)
{
/* clear window */
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef(x, y, 0);
//glRotatef(kat,0,0,1); rotacja w okolo osi z
/* draw unit square polygon */
glBegin(GL_TRIANGLES);
glVertex2f(-0.5, -0.5);
glVertex2f(0,0.4);
glVertex2f(0.5, -0.5);
glEnd();
/* flush GL buffers */
glPopMatrix();
glFlush();
}
static void Key(unsigned char key, int x_d, int y_d)
{
switch (key) {
case '1':
x += .1;
y += .1;
glutPostRedisplay();
break;
case '2':
x -= .1;
y -= .1;
glutPostRedisplay();
break;
case 27:
exit(0);
}
}
void init()
{
/* set clear color to black */
glClearColor(0.0, 0.0, 0.0, 0.0);
/* set fill color to white */
glColor3f(1.0, 1.0, 1.0);
/* set up standard orthogonal view with clipping */
/* box as cube of side 2 centered at origin */
/* This is default view and these statement could be removed */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("simple");
glutDisplayFunc(display);
glutKeyboardFunc(Key);
init();
glutMainLoop();
return 0;
}
Drodzy koledzy zróbmy tak, ja chcę tylko ruch na boki, zaś pomyślimy o sinusie.
Mój trójkąt jest ustawiony w środku okienka, jego podstawa ma rozmiar 1, całe okienko 2. Więc na początek musi się przesunąć w prawo o 0.5 jednostki w prawo i zaś na zmianę raz w lewo raz w prawo o jedną jednostkę - jakiś pomysł jak to osiągnąć? Nie męcząc się zbytnio z różnymi if`ami?
Chcesz żeby się przesuwało na boki względem jakiegoś punktu środkowego prawda? To teraz jak byś łaskawie zobaczł na sinus, o zwraca on wartości od -1 do 1 w zależności do kąta. Jeśli będziesz w pętli podawał kąt coraz większy, to będzie powoli przechodził z -1 do 1 i z powrotem. Teraz sobie tego sinusa pomnóż np razy 2 i już masz wartości -20 do 20. Dodaj tą wartość do położenia kwadratu w wybranej osi i będziesz miał oscylujący kwadrat.
To czego CI brakuje o nawet nie matematyka, nie programowanie. To połączenie jednego z drugim i wykorzystanie matematyki. Nie widzisz pewnch zależności i sposobów wykozystania. Musisz więcej ćwiczyć i pisać rzeczy dla siebie samego bo inaczej to marnie będzie...
misiakufal_not_logge napisał(a):
Chcesz żeby się przesuwało na boki względem jakiegoś punktu środkowego prawda? To teraz jak byś łaskawie zobaczł na sinus, o zwraca on wartości od -1 do 1 w zależności do kąta. Jeśli będziesz w pętli podawał kąt coraz większy, to będzie powoli przechodził z -1 do 1 i z powrotem. Teraz sobie tego sinusa pomnóż np razy 2 i już masz wartości -20 do 20. Dodaj tą wartość do położenia kwadratu w wybranej osi i będziesz miał oscylujący kwadrat.
Poza tym co z tego, że mi to napisałeś, jak nie wytłumaczyłeś. Mam zapisać funkcję sinusa i co dalej? Wy mówicie, a nie tłumaczycie co po kolei robić.
To może zapisze to co mam, bo widzę, że macie mnie za kogoś kto czeka na gotowca, a sami nie pragniecie wytłumaczyć:
static void timerCallback(int value)
{
if (x > -0.48)
{
if (licznik < 50)
{
x -= 0.5 / 50;
glutPostRedisplay();
glutTimerFunc(100, timerCallback, value);
}
}
else
{
x += 0.5 / 50;
glutPostRedisplay();
glutTimerFunc(100, timerCallback, value);
}
}
Trójkąt równoboczny przesuwa się od środka do lewej krawędzi i dalej nie wiem jak zrobić, żeby przesuwał się na zmianę o jedną jednostkę w prawo i w lewo i tak cały czas. Teraz przesuwanie się te jest ustawione na klawisz.
Ktoś mi zamierza z łaski swojej pomóc, jeśli oczekujecie kasy to powiedzcie wprost. Bo nie wiem czy marnuje czas pisząc tu czy nie:
Chciałem zrobić przesuwanie od boku do boku, ustawiłem trójkąt z wierzchołkiem dotykającym lewej krawędzi, sterowanie miało odbywać się poprzez dwa ify jeśli licznik jest podzielny przez "2" przesuwa się w prawo (standardowo na początku licznik ustawiony na '0') jeśli osiągnie x=1, miał licznik zmieniać się na '1' i ze względu na drugi if (sterowanie drugim if
em jeśli licznik jest liczbą nieparzystą miało przesuwać się w lewo) do momentu osiągnięcia x=-1, wtedy licznik zmienia się na '0' i tak w kółku, ale nie wiem czemu licznik mi się nie chce zmieniać. Czy zmienna 'x' pod którą ustawiam if'y to któryś z wierzchołków trójkąta czy co konkretnie?
Kod:
static void timerCallback(int value)
{
if (x <= 1 && x>=-1)
{
if (licznik %2 == 0)
{
x += 0.5 / 50;
glutPostRedisplay();
glutTimerFunc(100, timerCallback, value);
}
else if (licznik % 2 == 1)
{
x -= 0.5 / 50;
glutPostRedisplay();
glutTimerFunc(100, timerCallback, value);
}
if (x == 1) licznik = 1;
if (x == -1) licznik = 0;
}
}
@Edit 2
Udało mi się osiągnąć oscylację na boki w ten sposób:
static void timerCallback(int value)
{
if (x <= 1 && x>=0)
{
licznik++;
if (licznik<100)
{
x += 0.5 / 50;
glutPostRedisplay();
glutTimerFunc(100, timerCallback, value);
}
if (licznik>=100)
{
x -= 0.5 / 50;
glutPostRedisplay();
glutTimerFunc(100, timerCallback, value);
if (licznik==198) licznik = 0;
}
}
}
Jak wrócę spróbuję z sinusem.