znowu opengl cz2.

0

nie wiem jak zrobic aby bryla przeze mnie skonstruowana sie obracala albo przemieszczala.
moj kod to

procedure  szescian(a:real);
i:integer;
begin
glpushmatrix;
for i:=0 to 5 do begin
glbegin(gl_quads);
glnormal(0,0,1);
glvertex3f(a,a,a);
glvertex3f(a,-a,a);
glvertex3f(-a,-a,a);
glvertex3f(-a,a,a);
glend;
if odd(i) then glrotated(90,1,0,0) else glrotated(90,0,1,0);
end;
glpopmatrix;
end;

i teraz moj kod na obrot

procedure tform1.timer1;
begin
gl.makecurrent;
gl.invalidate;
glpushmatrix;
rotated(5,0,1,0);
rotated(5,1,0,0);
szescian(20);
glpopmatrix;
gl.makenotcurrent;
end;

i to ma sie obracac na skos .z widokiem szescianu nie ma problemu tylko z tym obracniem .pomocy.

0

hehhe dla początkującego taki błędzik wydaj się nie do wykrycia :D

chodzi oto, że jak masz w rysowaniu glLoadIdentity() i potem:

glpushmatrix;
rotated(5,0,1,0);
rotated(5,1,0,0);
szescian(20);
glpopmatrix;

to ogl zawsze narysuje to samo ! dlaczgo? bo on zawsze przekształca macierz tylko raz.
w lini:
rotated(5,1,0,0);
zamiast 5 daj zmienną globalną (w c++ można użyć static, w delphi chyba nie ma odpowiednika), którą będziesz zwiększał przy wywołaniu timera

0

wiesz co! co mi nie wychodzie ten kod ale zastosowalem inny .uzylem swakow jeden obraca os x duri y a trzeci z ale cos za wolnomi one przesuwaja.dodalem kod do rendera

glrotatef(scrollbar1.position1*50,1,0,0);
glrotatef(scrollbar1.position1*50,0,1,0);
glrotatef(scrollbar1.position1*50,0,0,1);

co jak by skakalo .jakby chcilo a nie moglo.
poradz mi raz jeszcze .
moje gg to
2450716

0

aha jakbys chcial pogadac ze mna na gg to <ort>Od razu</ort> mow o co chodzi bo nieznjomych <ort>Od razu</ort> blokuje zeby mi sie nie wczepiali na sile
dobra

0

ale kungfu :)
rotated ... pierwszy raz to widze :)
ale chodzi chyba oto ze za kazdym razem podajesz stala wartosc. szescian jest obracany (a dokslaniej scena bo potem masz rysowanie szescianu ;)) ciagle o stala wartosc. wiec Ci sie wydaje ze stoi w miejscu. Sprobuj ziwkeszac jedna z tych wartosci :)
w
glRotatef(angle, 0, 1, 0);
gdzie w timerze bedziesz zwiekszal ten angle o powiedzmy 0.1 (timerowi ustaw interval na 1)

ps. mala pomoc... ja bym na Twoim miejscu zrobil to rysowanie wzdarzneiu application.idle a nie w timerze :)

0

no dobra udalo sie, ale mam problm ze swiatlem .<ort>niewiem</ort> jak zrobic aby cztery swiala padaly z czterech stron i zeby szescian obracajac sie zmienial kolory z czterych stron tak jak na swiatlo pada .w specular (to chyba od kolorów ) probuje ustawic zeby byl czarny,czerwony a on mi wyswietla tylko bialy (zajamuje prawe caly szescian) niebieski nieraz zulty i dosc czesto zielony.
oto moj kod na swiatlo

procedure tform1.swiatlo;
const
amb: tglarrayf4  =(50.0,60.0,20.0,1.0);
dif: tglarrayf4  =(0.0,0.6,56.0,1.0);
emis:tglarrayf4 = (30.0,0.9,9.0,1.0);
pos3: tglarrayf4  =(150.4,150.7,-200.6,1.0);
pos2: tglarrayf4  =(-150.4,150.7,200.6,1.0);
pos1: tglarrayf4  =(-150.4,-200.7,-200.6,1.0);
pos: tglarrayf4  =(150.4,-150.7,-100.6,1.0);
spec3: tglarrayf4  =(0.0,60.0,5.0,1.0);
spec2: tglarrayf4  =(0.4,56.7,0.6,1.0);
spec1: tglarrayf4  =(255.4,0.7,0.6,1.0);
spec  :tglarrayf4   =(0.0,6.0,34.0,1.0);
begin

gllightmodelfv(gl_light_model_ambient,@amb);
gllightfv(gl_light1,gl_specular,@spec);
gllightfv(gl_light1,gl_position,@pos);
 glenable(gl_light1);

gllightfv(gl_light0,gl_specular,@spec1);
gllightfv(gl_light0,gl_diffuse,@dif);
gllightfv(gl_light0,gl_position,@pos1);
glenable(gl_light0);

gllightfv(gl_light2,gl_specular,@spec2);
gllightfv(gl_light2,gl_ambient,@amb);
gllightfv(gl_light2,gl_position,@pos2);
glenable(gl_light2);

gllightfv(gl_light3,gl_specular,@spec3);
gllightfv(gl_light3,gl_emission,@emis);
 gllightfv(gl_light3,gl_position,@pos3);
glenable(gl_light3);

end;


procedure TForm1.GLSetupRC(Sender: TObject);
 const
amb:tglarrayf4=(1.6,0.2,0.8,1.2);
pos:tglarrayf4=(0.6,0.2,2.8,1.0);
spec:tglarrayf4=(2.2,0.5,3.1,1.0);
emis:tglarrayf4=(0.6,3.2,0.8,1.7);
dif:tglarrayf4=(2.6,1.2,0.3,1.0);
begin
glclearcolor(0,0,0,1);
glenable(gl_depth_test);
glenable(gl_lighting);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_NORMALIZE);
rozmiar;
glmaterialfv(gl_front_and_back,gl_ambient_and_diffuse,@amb);
glmaterialf(gl_back,gl_shininess,80);
glmaterialfv(gl_front_and_back,gl_emission,@emis);
glmaterialfv(gl_front_and_back,gl_specular,@spec);
glmaterialfv(gl_front_and_back,gl_position,@pos);
end;

aaa
jak jeszcze by mi wytlumaczyli co znacza takie polecenia

glpopmatrix
glpushmatrix
glenable(gl_normlize)
gllightmodelfv(gl_light_model_ambient,@amb)
glmaterialfv(gl_front_and_back,gl_position,@pos)

glmteriafv to z ktorej strony bedzie padaly kolory bo jezeli jest z sprzodu i z tylu ale, nie bedzie z bokuw ,czemu i ktore strony szescianu mi pokryje bo w tej bieli za bardzo nie widze .raz tam mi sie udalo zrobic zeby bylo na zielono ,niebiesko i zulto ale jak chcialem zrobic czerwony to sie zrobily wszystkie boki biale</ort>

1 użytkowników online, w tym zalogowanych: 0, gości: 1