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?
- 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).
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ć.
Matematyka kolego. @Azarien powiedział jak to uzyskać
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.
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.
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.