<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>https://vik.wiki/index.php?action=history&amp;feed=atom&amp;title=GrafikaGyakorloAnimacio</id>
	<title>GrafikaGyakorloAnimacio - Laptörténet</title>
	<link rel="self" type="application/atom+xml" href="https://vik.wiki/index.php?action=history&amp;feed=atom&amp;title=GrafikaGyakorloAnimacio"/>
	<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=GrafikaGyakorloAnimacio&amp;action=history"/>
	<updated>2026-05-17T04:14:33Z</updated>
	<subtitle>Az oldal laptörténete a wikiben</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://vik.wiki/index.php?title=GrafikaGyakorloAnimacio&amp;diff=137331&amp;oldid=prev</id>
		<title>Unknown user: Új oldal, tartalma: „{{GlobalTemplate|Infoalap|GrafikaGyakorloAnimacio}}  ===Mintakérdések a Számítógépes grafika és képfeldolgozás tárgy vizsgájára való felkészüléshez===  …”</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=GrafikaGyakorloAnimacio&amp;diff=137331&amp;oldid=prev"/>
		<updated>2012-10-21T19:58:43Z</updated>

		<summary type="html">&lt;p&gt;Új oldal, tartalma: „{{GlobalTemplate|Infoalap|GrafikaGyakorloAnimacio}}  ===Mintakérdések a Számítógépes grafika és képfeldolgozás tárgy vizsgájára való felkészüléshez===  …”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Új lap&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{GlobalTemplate|Infoalap|GrafikaGyakorloAnimacio}}&lt;br /&gt;
&lt;br /&gt;
===Mintakérdések a Számítógépes grafika és képfeldolgozás tárgy vizsgájára való felkészüléshez===&lt;br /&gt;
&lt;br /&gt;
====Animáció====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;116. Írjon Animate függvényt C++-ban, amely egy galaxis égitestjeinek a helyzetét (newtoni) fizikai animációval számítja ki a t időpillanatra. Összesen 100 égitest van, amelyek tömegei az m[100] tömbben, sugaraik az r[100] tömbben vannak. Az égitestek kezdeti helyzetei (x[100], y[100], z[100]) tömbökben találhatók. A t=0 időpillanatban az égitestek állnak. Az égitestek ütközése teljesen rugalmatlan (figyelem, az impulzus megmarad!), azaz ütközéskor összetapadnak, innentől úgy tekintjük őket, mint egy gömböt, amelynek sugarai a találkozó gömbök sugarainak összege. A Newton-féle gravitációs állandó f.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Még pár globális változó, amire szükség van: vx, vy, vz tömbök a sebességet tárolják, prevT a legutóbbi időpillanatot, amikor meg volt hívva az Animate, nextIter két hívás közt tárolja, hanyadik iteráció következik majd, dt a szimuláció lépésköze, num az aktuális száma az objektumoknak (az összetapadások miatt ez változhat).&lt;br /&gt;
* Animate minden híváskor kiszámolja, hány lépésnyit kell futtatni a szimulációt. Minden lépésben először az összes objektum gyorsulását számolja a helyzete alapján, majd a sebességét a gyorsulása, aztán a helyzetét a sebessége alapján, végül meghívja checkMerge-et. checkMerge minden objektumpárra megvizsgálja, érintkeznek-e, és ha igen, merge segítségével (az impulzus- és tömegközéppontmegmaradási tételt figyelembe véve) egyesíti őket. Az egyesítés hatására keletkezhetnek új érintkezések, ezért ilyenkor mindig újra végignéz mindent.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
float vx[100], vy[100], vz[100];&lt;br /&gt;
float prevT=0;&lt;br /&gt;
int nextIter=0;&lt;br /&gt;
float dt=0.01;&lt;br /&gt;
int num=100;&lt;br /&gt;
&lt;br /&gt;
void getAccel(int obj, float* ax, float* ay, float* az) {&lt;br /&gt;
  float dx, dy, dz, temp;&lt;br /&gt;
  ax=ay=az=0;&lt;br /&gt;
  for (int i=0; i&amp;lt;num; i++) {&lt;br /&gt;
	 dx=x[i]-x[obj];&lt;br /&gt;
	 dy=y[i]-y[obj];&lt;br /&gt;
	 dz=z[i]-z[obj];&lt;br /&gt;
	 temp=pow(dx*dx+dy*dy+dz*dz, -1.5)*f*m[i];&lt;br /&gt;
	 ax+=dx*temp;&lt;br /&gt;
	 ay+=dy*temp;&lt;br /&gt;
	 az+=dz*temp;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void merge(int i, int j) {&lt;br /&gt;
  float c=m[i]/(m[i]+m[j]);&lt;br /&gt;
  x[i]=x[i]*c+x[j]*(1-c);&lt;br /&gt;
  y[i]=y[i]*c+y[j]*(1-c);&lt;br /&gt;
  z[i]=z[i]*c+z[j]*(1-c);&lt;br /&gt;
  vx[i]=vx[i]*c+vx[j]*(1-c);&lt;br /&gt;
  vy[i]=vy[i]*c+vy[j]*(1-c);&lt;br /&gt;
  vz[i]=vz[i]*c+vz[j]*(1-c);&lt;br /&gt;
  r[i]=r[i]+r[j];&lt;br /&gt;
  for (int k=j+1; k&amp;lt;num; k++) {&lt;br /&gt;
	 x[k-1]=x[k];&lt;br /&gt;
	 y[k-1]=y[k];&lt;br /&gt;
	 z[k-1]=z[k];&lt;br /&gt;
	 vx[k-1]=vx[k];&lt;br /&gt;
	 vy[k-1]=vy[k];&lt;br /&gt;
	 vz[k-1]=vz[k];&lt;br /&gt;
	 r[k-1]=r[k];&lt;br /&gt;
	 m[k-1]=m[k];&lt;br /&gt;
  }&lt;br /&gt;
  num--;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void checkMerge() {&lt;br /&gt;
  bool merged=true;&lt;br /&gt;
  float dx, dy, dz;&lt;br /&gt;
  while (merged) {&lt;br /&gt;
	 merged=false;&lt;br /&gt;
	 for (int i=0; i&amp;lt;num; i++) {&lt;br /&gt;
		for (int j=i+1; j&amp;lt;num; j++) {&lt;br /&gt;
		  dx=x[i]-x[j];&lt;br /&gt;
		  dy=y[i]-y[j];&lt;br /&gt;
		  dz=z[i]-z[j];&lt;br /&gt;
		  if (dx*dx+dy*dy+dz*dz&amp;lt;(r[i]+r[j])*(r[i]+r[j])) {&lt;br /&gt;
			 merge(i, j);&lt;br /&gt;
			 merged=true;&lt;br /&gt;
		  }&lt;br /&gt;
		}&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Animate(float t) {&lt;br /&gt;
  float ax, ay, az;&lt;br /&gt;
  for (int i=nextIter; i&amp;lt;(int)(t/dt); i++) {&lt;br /&gt;
	 for (int j=0; j&amp;lt;num; j++) {&lt;br /&gt;
		getAccel(j, &amp;amp;ax, &amp;amp;ay, &amp;amp;az);&lt;br /&gt;
		vx[j]+=ax*dt;&lt;br /&gt;
		vy[j]+=ay*dt;&lt;br /&gt;
		vz[j]+=az*dt;&lt;br /&gt;
	 }&lt;br /&gt;
	 for (int j=0; j&amp;lt;num; j++) {&lt;br /&gt;
		x[j]+=vx[j]*dt;&lt;br /&gt;
		y[j]+=vy[j]*dt;&lt;br /&gt;
		z[j]+=vz[j]*dt;&lt;br /&gt;
	 }&lt;br /&gt;
	 checkMerge();&lt;br /&gt;
  }&lt;br /&gt;
  prevT=t;&lt;br /&gt;
  nextIter=(int)(t/dt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;117. Inverz kinematika. Cél. Új állapot meghatározása. Pszeudo-inverz. Algoritmus.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Animációban, robotikában szokott előállni az a helyzet, hogy valaminek a helyzetét egy összetett transzformációval lehet meghatározni. Pl. a váll helyzetéből egy eltolással és forgatással kapjuk meg a könyök helyzetét, abból hasonlóan a csuklóét. Mindkét transzformációnak vannak bizonyos szabadságfokai: a felkarnak a hossza állandó, de az iránya bármilyen lehet, és csavarodhat is a tengelye körül, az alkarnak is állandó a hossza, de (a könyökízület jellege miatt) csak egy körön mozoghat, és csavarodni is kevésbé tud. Másfajta szabadságfokok (pl. 122., 123., 128. feladat) is előfordulhatnak.&lt;br /&gt;
* Ha ismerjük az egyes szabadságfokok állapotát (pl. váll- és könyökízület szöge, csavarodása), akkor általában könnyű számítani a kar végének (end effektor) helyét és helyzetét, a gyakorlatban viszont gyakrabban van szükség a fordítottjára: adott helyre, adott pályán akarjuk mozgatni a kart, hogyan vezéreljük ehhez a csuklókat?&lt;br /&gt;
* Általában az összetett transzformáció nemlineáris, és több szabadságfokunk van, mint ahány paramétere az end effektornak (pl. két gömbcsukló összesen 4 szabadságfok, de ha az end effektornak csak a helyzete érdekel, az csak 3 beállítandó paraméter), tehát egy több megoldású nemlineáris egyenletrendszert kell megoldanunk. Erre közelító módszereket szoktak használni, az egyik a Jacobi-mátrix pszeudoinverze.&lt;br /&gt;
* Ha &amp;lt;math&amp;gt; E_i &amp;lt;/math&amp;gt; az end effektor i. paramétere, és &amp;lt;math&amp;gt; S_j &amp;lt;/math&amp;gt; a j. szabadságfok, akkor a Jacobi-mátrix i. sorának j. eleme &amp;lt;math&amp;gt; \frac{\partial E_i}{\partial S_j} &amp;lt;/math&amp;gt; Ha ugyanannyi szabadságfok van, mint end effektor paraméter, akkor ez egy négyzetes mátrix, és az inverze segítségével számítható, hogy egy kicsi &amp;lt;math&amp;gt; \Delta\underline{E} &amp;lt;/math&amp;gt; változáshoz hogyan változtassuk &amp;lt;math&amp;gt; \underline{S} &amp;lt;/math&amp;gt;-t. Általában nem ez a helyzet, és az inverz helyett a nem négyzetes mátrixokra is értelmezett pszeudoinverzet kell használni: &amp;lt;math&amp;gt; J^+=(J^T J)^{-1}J^T &amp;lt;/math&amp;gt; Így, felbontva az end effektor kívánt mozgását kicsi &amp;lt;math&amp;gt; \Delta\underline{E} &amp;lt;/math&amp;gt; lépésekre, mindegyikhez előállítható az állapotváltozók szükséges változtatása: &amp;lt;math&amp;gt; \Delta\underline{S}=J^+ \Delta\underline{E} &amp;lt;/math&amp;gt;&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Moore-Penrose_pseudoinverse#Full_rank Wikipédia: pszeudoinverz]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Inverse_kinematics Wikipédia: Inverz kinematika]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Inverse_kinematic_animation Wikipédia: Animáció inverz kinematikával]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;118. Adja meg a forward és inverz kinematikát alkalmazó mozgástervezés lépéseit és hasonlítsa össze lehetőségeit!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;119. Adott egy kör alakú biliárdasztal. Az asztal középpontjában vesszük fel a koordinátarendszerünket. Az asztal sugara R. Írjon Animate függvényt C++-ban, amely kiszámítja egy biliárdgolyó helyzetét a t időpillanatra, feltételezve, hogy t=0-ban a golyót az (x0, y0) pontból és (vx, vy) kezdősebességgel indítottuk el, csak ez az egyetlen golyó az asztalon, a golyó az asztal oldalával tökéletesen rugalmasan ütközik, és a súrlódást elhanyagoljuk.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;120. Vesse össze a Lagrange interpolációs görbét, a B-spline-t és a NURBS-t az animációs mozgásgörbék szempontjából. Táblázatosan mutassa be, hogy milyen előnyös és hátrányos tulajdonságaik vannak. A tulajdonságok között feltétlenül szerepeljenek az alábbiak: konvex burok tulajdonság, lokális kontroll, paraméter-idő hozzárendelés, interpolációs tulajdonság.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;121. Egy labda pattogását a magasságfüggvény kulcspozícióival (keyframe) adjuk meg: t=0: y=0; t=1: y=1; t=3: y=0; t=6: y=1. Mi a labda y koordinátája t=2-kor, ha Catmull-Rom spline-t használunk interpolációra (a Catmull-Rom spline a Kochanek-Bartels spline speciális esete, amikor &amp;lt;math&amp;gt; \tau &amp;lt;/math&amp;gt; zérus, &amp;lt;math&amp;gt; \beta &amp;lt;/math&amp;gt; pedig 0.5).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Catmull.E2.80.93Rom_spline Wikipédia: Catmull-Rom spline]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Kochanek%E2%80%93Bartels_spline Wikipédia: Kochanek-Bartels spline]&lt;br /&gt;
* Megjegyzés: Wikipédiában máshogy használják a paramétereket, az ott használt paramétereket mind nullára kell állítani, hogy a Kochanek-Bartelsből a Catmull-Rom kijöjjön.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;122. Adott egy, a koordinátarendszer origójában rögzített csukló, amely a z tengely körüli elfordulását és a hosszát képes változtatni. Írja fel a rendszer Jacobi mátrixát. Írjon programot, amely csukló másik végpontját a [1,1], [0, 2] pontok között egyenletes sebességgel végigvezeti. Feltételezheti, hogy az adott programozási nyelven a mátrixműveletek rendelkezésre állnak.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;123. Adott egy 2D világban mozgó robotkar, amelynek egyik vége az origóhoz rögzített. A robotkar a rögzített vége körül el tud fordulni, és a hosszát is meg tudja változtatni. Írja fel a robotkar Jacobi mátrixát, állítsa elő a mátrix pszeudoinverzét. Írjon C++ függvényt, amely dt időszeletenként lépdelve kiszámítja a robotkar elfordulási szögét és hosszát, ha annak nem rögzített végét az x(t), y(t) pályán kell végigvezetni.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;124. Egydimenziós mozgást kulcskeret animációval definiál. A tárgy a t=0 időpillanatban az x=0 pontban, a t=1 időpillanatban az x=1 pontban, a t=2 időpillanatban megint az x=0 pontban van. A mozgás nyugalmi helyzetből indul és így is fejeződik be (sebesség zérus). Hol van a tárgy a t=0.4 időpontban, ha Catmull-Rom spline-nal interpolálunk?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;125. Saját magát szeretné egy animációs filmben szerepeltetni, amint éppen egy lépcsőfokra föllép. Írja le pontokként, hogy ehhez mit kell tenni, ha kulcskeret (keyframe) animációs eljárást használ.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;126. Saját magát szeretné egy animációs filmben szerepeltetni, amint éppen egy lépcsőfokra föllép. Írja le pontokként, hogy ehhez mit kell tenni, ha mozgáskövető (motion tracking) animációs eljárást használ.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;127. Egy létező tárgy 3D modelljét szeretné létrehozni. Hogyan valósítható meg a sztereolátás alkalmazásával? Mi változik, ha 2-nél több kamerát használ?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;128. Adott egy két transzlációs csuklót tartalmazó robot. A transzlációs csukló orientációja állandó, csak a hosszát képes változtatni. Az ábra szerint, az első csukló x irányú eltolást, a második y irányú eltolást jelenthet. Írja fel a robot Jacobi mátrixát! Adja meg a mátrix pszeudoinverzét! Hogyan kell vezérelni a csuklókat, hogy az endeffektor egy körön menjen végig &amp;lt;math&amp;gt; 2\pi &amp;lt;/math&amp;gt; szögsebességgel?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{InLineImageLink|Infoalap|GrafikaGyakorloAnimacio|Clipboard05.png}}&lt;br /&gt;
&lt;br /&gt;
* Ha az első csukló állapotát (itt: hosszát) &amp;lt;math&amp;gt; S_1 &amp;lt;/math&amp;gt;-gyel jelöljük, a másodikét pedig &amp;lt;math&amp;gt; S_2 &amp;lt;/math&amp;gt;-vel jelöljük, a kar végpontjának helyzetét pedig &amp;lt;math&amp;gt; (r, \phi) &amp;lt;/math&amp;gt;-vel (mivel majd körön akarunk mozgatni, ezért a polárkoordinátás leírás a célszerű), akkor &amp;lt;math&amp;gt; (r, \phi)=(\sqrt{S_1^2+S_2^2}, atan \frac{S_2}{S_1}) &amp;lt;/math&amp;gt;. A Jacobi-mátrix: &amp;lt;math&amp;gt; J=\left[\begin{array}{cc} \frac{\partial r}{\partial S_1} &amp;amp; \frac{\partial r}{\partial S_2} \\ \frac{\partial \phi}{\partial S_1} &amp;amp; \frac{\partial \phi}{\partial S_2}\end{array}\right] = \left[\begin{array}{cc} \frac{S_1}{\sqrt{S_1^2+S_2^2}} &amp;amp; \frac{S_2}{\sqrt{S_1^2+S_2^2}} \\ \frac{-S_2}{S_1^2+S_2^2} &amp;amp; \frac{S_1}{S_1^2+S_2^2} \end{array}\right]&amp;lt;/math&amp;gt;&lt;br /&gt;
* Négyzetes, invertálható mátrix pszeudoinverze megegyezik a szokásos inverzével, azaz itt az inverz: &amp;lt;math&amp;gt; J^+ = \left[\begin{array}{cc} \frac{S_1}{\sqrt{S_1^2+S_2^2}} &amp;amp; -S_2 \\ \frac{S_2}{\sqrt{S_1^2+S_2^2}} &amp;amp; S_1 \end{array}\right]&amp;lt;/math&amp;gt; A megkövetelt deriváltja az end effektor helyzetének: &amp;lt;math&amp;gt; (0, 2\pi) &amp;lt;/math&amp;gt;, mivel a sugár nem változik, a szög pedig konstans szögsebességgel. Ez alapján a csuklók állapotára: &amp;lt;math&amp;gt; \left[\begin{array}{c} dS_1 \\ dS_2 \end{array}\right] = J^+ \left[\begin{array}{c} 0 \\ 2\pi \end{array}\right] = \left[\begin{array}{cc} -2\pi S_2 \\ 2\pi S_1 \end{array}\right] &amp;lt;/math&amp;gt; és ez alapján a kezdőpozíció felhasználásával már ki lehet számítani (pl. iteratív módszerrel), hogy melyik pillanatban hogyan változzon a csuklók állapota.&lt;br /&gt;
* [http://www.nbb.cornell.edu/neurobio/land/OldStudentProjects/cs490-96to97/hoffman/IK.html Inverz kinematika]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;129. Egy egység tömegű test tömegközéppontjának pályáját egy síkbeli Bézier görbével adhatjuk meg, amelynek vezérlőpontjai: (0,0), (1,1), (2,0). Mekkora eredő erő hat a testre a t=0.33 időpillanatban?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* A test helyzetének időfüggvénye: &amp;lt;math&amp;gt; r(t)=(x(t), y(t))=(0, 0)(1-t)^2+(1, 1)(2t(1-t))+(2, 0)t^2 = (2t, 2t-t^2) &amp;lt;/math&amp;gt; a rá ható erő pedig a helyvektorának a második deriváltja (a gyorsulása) szorozva a tömegével (ami 1): &amp;lt;math&amp;gt; F(t)=m\cdot(x^{\prime\prime}, y^{\prime\prime})=1\cdot(0, -4)=(0, -4) &amp;lt;/math&amp;gt;, tehát a rá ható eredő erő konstans 4, és a negatív y irányba mutat.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;130. Egy labdát szeretne animálni kulcskeret animációval, Catmull-Rom spline alkalmazásával. A kulcskeretek a következők (t-vel az időt jelöljük és másodpercben értelmezzük):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;t=0: a labdát a [0, 1, 0] pontból [1, 1, 0] sebességgel elhajítjuk.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;t=1: a labda az [1, 2, 0] pontban repül.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;t=2: a labda a [2, 0, 0] pontba csapódik [1,-1,0] sebességgel, és tökéletesen rugalmatlanul ütközik a talajjal.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Tételezzük fel, hogy az előző feladat megoldásául kapott paraméteres egyenletet egy Vector r(float t) függvényben már megvalósítottuk. Egészítse ki az alábbi programot a Labda( ) függvény implementációjával, amely a labda mozgását OpenGL segítségével animálja. A labda fehér, 40x40 háromszögre tesszellált gömb, amelynek sugara 2.*&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Vector{float x, y, z; };&lt;br /&gt;
GLUquadricObj * labda;&lt;br /&gt;
Vector r( float t );&lt;br /&gt;
&lt;br /&gt;
void Labda( ) { ... }&lt;br /&gt;
&lt;br /&gt;
main( argc, argv ) {&lt;br /&gt;
	  glutInitWindowSize(width, height);  glutInit(&amp;amp;argc, argv);&lt;br /&gt;
	  glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH);&lt;br /&gt;
	  glutCreateWindow(&amp;quot;Labda&amp;quot;);&lt;br /&gt;
	  glMatrixMode(GL_PROJECTION); &lt;br /&gt;
	  glLoadIdentity(); &lt;br /&gt;
	  gluPerspective(60, 1, 1, 1000);&lt;br /&gt;
	  glMatrixMode(GL_MODELVIEW); &lt;br /&gt;
	  glLoadIdentity();	 &lt;br /&gt;
	  labda = gluNewQuadric( );&lt;br /&gt;
	  glEnable(GL_DEPTH_TEST);&lt;br /&gt;
	  glutDisplayFunc( Labda ); &lt;br /&gt;
	  glutIdleFunc( Labda ); &lt;br /&gt;
	  glutMainLoop();&lt;br /&gt;
}  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Segítség: a következő OpenGL függvényekből érdemes válogatni (nem szükségképpen mindet!): glPushMatrix( ), glPopMatrix( ), glColor3f(), glVertex3f(), glTranslatef( ), glRotatef( ), glScalef( ), gluSphere( ); glClearColor( ); glutSwapBuffers(), glTexCoord2f(), glBindTexture(), glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glutGet(GLUT_ELAPSED_TIME);&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;131. Egy háromszög csúcsainak koordinátái a lokális modellezési koordinátarendszerben [0,0,0], [1,0,0], [0,1,0]. Animálja a háromszöget keyframe (kulcskeret) animáció segítségével úgy, hogy a háromszög orientációja állandó maradjon, a pozíciót pedig a kulcskeretekből lineáris interpolációval számítsa ki! Tételezze fel, hogy a kulcskeretek időértékei a float t[] globális tömbben, az első csúcs pozíciója pedig ezekben a kulcskeretekben a Vector v[] tömbben vannak. A kulcskeretek száma int nf. A rajzolást OpenGL hívásokkal végezze el. Feltételezheti, hogy IdleCallback-ként az Idle függvényt regisztráltuk, tehát csak az Idle-t kell megírni, az inicializálási és kamerabeállító részt nem. A rajzolást GL_TRIANGLES beállítással végezze, a háromszög színe fehér. Az alkalmazás indítása óta eltelt időt glutGet(GLUT_ELAPSED_TIME) hívással kérdezheti le. Segítségnek az ajánlott OpenGL parancsok: glBegin, glEnd, glFlush, glVertex3f, glColor3f, glTranslatef, glPushMatrix, glPopMatrix, glLoadIdentity, glutSwapBuffers, glClear. Mit és hogyan kell változtatni a programban ahhoz, hogy ne lineáris, hanem Catmull-Rom spline interpolációval dolgozzon (a Catmull-Rom spline a Kochanek-Bartels spline speciális esete, amikor &amp;lt;math&amp;gt; \tau &amp;lt;/math&amp;gt; zérus, &amp;lt;math&amp;gt; \beta &amp;lt;/math&amp;gt; pedig 0.5)?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Először meghatározzuk, melyik időszeletben vagyunk, vagyis melyik két kulcskeret közt, és hogy annak a szakasznak &amp;quot;hány százalékánál&amp;quot; tartunk. Majd interpoláljuk a két kulcskeretet, megkapva ezzel, hogyan kell eltolni a koordinátarendszert rajzolás előtt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Idle() {&lt;br /&gt;
  float time=glutGet(GLUT_ELAPSED_TIME), param;&lt;br /&gt;
  int interval=-1;&lt;br /&gt;
  for (int i=0; i&amp;lt;nf-1; i++) {&lt;br /&gt;
	 if (t[i]&amp;lt;=time &amp;amp;&amp;amp; time&amp;lt;=t[i+1]) {&lt;br /&gt;
		interval=i;&lt;br /&gt;
		break;&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
  if (interval==-1) return;&lt;br /&gt;
  param=(time-t[interval])/(t[interval+1]-t[interval]);&lt;br /&gt;
  Vector translate=param*v[interval+1]+(1-param)*v[interval];&lt;br /&gt;
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);&lt;br /&gt;
  glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
  glLoadIdentity();&lt;br /&gt;
  glPushMatrix();&lt;br /&gt;
  glTranslate3f(translate.x, translate.y, translate.z);&lt;br /&gt;
  glBegin(GL_TRIANGLES);&lt;br /&gt;
  glColor3f(1, 1, 1);&lt;br /&gt;
  glVertex3f(0, 0, 0);&lt;br /&gt;
  glVertex3f(1, 0, 0);&lt;br /&gt;
  glVertex3f(0, 1, 0);&lt;br /&gt;
  glEnd();&lt;br /&gt;
  glPopMatrix();&lt;br /&gt;
  glutSwapBuffers();&lt;br /&gt;
  glFlush();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* A Catmull-Rom spline a harmadfokú spline speciális esete, ezért az n. és n+1. kulcspont között harmadfokú polinomokkal interpolálunk, amihez felhasználjuk a görbe kulcspontokban felvett deriváltját (v0, v1). Ez Catmull-Rom spline-nál az n-1. és n+1., illetve az n. és n+2. kulcshelyzetekből számítható, illetve a 0. és utolsó kulcspontban külön meg kell adni (vStart, vEnd).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Idle() {&lt;br /&gt;
  /* az eleje ugyanaz, a paraméter kiszámításáig */&lt;br /&gt;
  Vector v0, v1;&lt;br /&gt;
  if (interval==0 &amp;amp;&amp;amp; interval+1==nf) {&lt;br /&gt;
	 v0=vStart;&lt;br /&gt;
	 v1=vEnd;&lt;br /&gt;
  } else if (interval==0) {&lt;br /&gt;
	 v0=vStart;&lt;br /&gt;
	 v1=(v[interval+2]-v[interval])/2;&lt;br /&gt;
  } else if (interval+1==nf) {&lt;br /&gt;
	 v0=(v[interval+1]-v[interval-1])/2;&lt;br /&gt;
	 v1=vEnd;&lt;br /&gt;
  } else {&lt;br /&gt;
	 v0=(v[interval+1]-v[interval-1])/2;&lt;br /&gt;
	 v1=(v[interval+2]-v[interval])/2;&lt;br /&gt;
  }&lt;br /&gt;
  float p2=p*p, p3=p*p*p;&lt;br /&gt;
  translate=v0*(p3-2*p2+p)+v1*(p3-p2)+v[interval]*(2*p3-3*p2+1)+v[interval+1]*(-2*p3+3*p2);&lt;br /&gt;
  /* a rajzoló rész ugyanaz... */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;132. Az alábbi lövedék röpül a hegyes végét elől tartva (úgy, ahogy egy tisztességes lövedéktől elvárható) a 3D virtuális térben (lásd a lenti rajzot). A lövedék hengeres részének magassága 4 m, a kúpos részének magassága 2 m, átmérője 1.5 m. A lövedék végének középpontja az [x0, y0, z0] pontról indul [vx0, vy0, vz0] kezdősebességgel. A lövedék az ágyúcső hornyolása miatt f [fok/sec] szögsebességgel forog a főtengelye körül. A nehézségi gyorsulás g [m/sec2], a közegellenállás elhanyagolható, ütközés nincs. Írjon C függvényt, amely képletanimációval meghatározza a t pillanatban érvényes mozgásállapotot, és OpenGL függvényhívások segítségével fel is rajzolja a lövedéket. A rajzoláshoz felhasználhatja a Henger() függvényt, amely egy 1 m magasságú, origo középpontú, z tengelyű, 1 m átmérőjű hengert jelenít meg, és a Kúp() függvényt, amely egy xy síkon álló, 1 m magas, 1 m átmérős alapkörrel rendelkező kúpot rajzol fel.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{InLineImageLink|Infoalap|GrafikaGyakorloAnimacio|Clipboard06.png}}&lt;br /&gt;
&lt;br /&gt;
* Frenet kereteket használunk; ez egy speciális, a mozgó test pályájához igazodó koordinátarendszer. Az origója a testhez van rögzítve (nem pontszerű testnél pl. a tömegközépponthoz lehet), z tengelye a mozgás irányába mutat (vagyis a helyvektor első deriváltjával párhuzamos), y tengelye pedig gyorsulással (a helyvektor  második deriváltjával) ellentétes irányba. Hogy a tengelyek merőlegesek legyenek, ezért y nem a második derivált ellentettje, hanem annak a z-re merőleges komponense, x pedig értelemszerűen y és z vektorszorzata. Képletekkel: &amp;lt;math&amp;gt; \underline{z}(t)=(\underline{r}(t)^\prime)^0,\; \underline{y}(t)=((\underline{r}^{\prime\prime}(t) \times \underline{r}^\prime(t)) \times \underline{r}^\prime(t))^0,\; \underline{x}(t)=\underline{y}(t) \times \underline{z}(t) &amp;lt;/math&amp;gt; ahol a 0-s kitevő azt jelenti, hogy egységvektor.&lt;br /&gt;
* A test mozgása nagyon egyszerű: &amp;lt;math&amp;gt; \underline{r}^{\prime\prime}(t)=(0, -g, 0) &amp;lt;/math&amp;gt;, mert g-vel gyorsul lefelé. Az első deriváltra a kezdetiérték-feltétel: &amp;lt;math&amp;gt; \underline{r}^\prime(0)=(v_{0x}, v_{0y}, v_{0z}) &amp;lt;/math&amp;gt; ez alapján &amp;lt;math&amp;gt; \underline{r}^\prime(t)=(v_{0x}, v_{0y}-gt, v_{0z}) &amp;lt;/math&amp;gt; A hely kezdeti értéke: &amp;lt;math&amp;gt; \underline{r}(0)=(r_{0x}, r_{0y}, r_{0z}) &amp;lt;/math&amp;gt;, így &amp;lt;math&amp;gt; \underline{r}(t)=(r_{0x}+v_{0x}t, r_{0y}+v_{0y}t-g\frac{t^2}{2}, r_{0z}+v_{0z}t) &amp;lt;/math&amp;gt;&lt;br /&gt;
* Rajzoláskor először kiszámítjuk a hely-, sebesség- és gyorsulásvektorokat, majd ezekből a Frenet keret bázisvektorait. Először a keretbe transzformálunk, majd a lövedék forgása miatt f*t-vel forgatunk a lövedék tengelye (z) körül, valamint ahhoz, hogy a Kup() és Henger() jó helyre és jó méretben rajzoljon, még kell pár plusz transzformáció.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Missile {&lt;br /&gt;
  Vector r0;&lt;br /&gt;
  Vector v0;&lt;br /&gt;
  float f;&lt;br /&gt;
  void drawCone() {&lt;br /&gt;
	 glPushMatrix();&lt;br /&gt;
	 glScalef(1.5, 1.5, 2);&lt;br /&gt;
	 Kup();&lt;br /&gt;
	 glPopMatrix();&lt;br /&gt;
  }&lt;br /&gt;
  void drawCylinder() {&lt;br /&gt;
	 glPushMatrix();&lt;br /&gt;
	 glTranslatef(0, 0, -2);&lt;br /&gt;
	 glScalef(1.5, 1.5, 4);&lt;br /&gt;
	 Henger();&lt;br /&gt;
	 glPopMatrix();&lt;br /&gt;
  }&lt;br /&gt;
  void draw(float t) {&lt;br /&gt;
	 Vector r(r0.x+v0.x*t, r0.y+v0.y*t-g*t*t/2, r0.z+v0.z*t);&lt;br /&gt;
	 Vector v(v0.x, v0.y-g*t, v0.z);&lt;br /&gt;
	 Vector a(0, -g, 0);&lt;br /&gt;
	 Vector frenetZ=a.normalize();&lt;br /&gt;
	 Vector frenetY=((a%v)%v).normalize();&lt;br /&gt;
	 Vector frenetX=frenetY%frenetZ;&lt;br /&gt;
	 float frenetTransform[16]={frenetX.x, frenetX.y, frenetX.z, 0,\&lt;br /&gt;
										 frenetY.x, frenetY.y, frenetY.z, 0,\&lt;br /&gt;
										 frenetZ.x, frenetZ.y, frenetZ.z, 0,\&lt;br /&gt;
										 r.x,		 r.y,		 r.z,		 1};&lt;br /&gt;
	 glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
	 glPushMatrix();&lt;br /&gt;
	 glMultMatrix(frenetTransform);&lt;br /&gt;
	 glRotatef(f*t, 0, 0, 1);&lt;br /&gt;
	 drawCone();&lt;br /&gt;
	 drawCylinder();&lt;br /&gt;
	 glPopMatrix();&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;133. Egy pontszerű test kétdimenziós mozgását Catmull-Rom spline-nal adja meg. A kulcspontok:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;t=0: x=0, y=0, vx=VX, vy=VY&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;t=1: x=VX, y=H&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;t=2: x=2VX, y=0, vx=VX, vy=-VY&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*A VX, VY, H értékek konstansok. Adja meg az x(t), x(t) mozgásgörbék algebrai alakján a [0, 1] időintervallumban! (segítség: a Catmull-Rom spline a Kochanek-Bartels spline speciális esete, amikor &amp;lt;math&amp;gt; \tau &amp;lt;/math&amp;gt; zérus, &amp;lt;math&amp;gt; \beta &amp;lt;/math&amp;gt; pedig 0.5).*&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;134. Marcus Aurelius a barbárok ellen hadakozik. A barbárok kőhajítókkal támadnak, Marcus bátran és mozdulatlanul áll. A sziklák lényegesen kövérebbek Marcusnál, tehát nem lehetne Marcus belsejében elrejteni azokat, viszont nem feltétlenül magasabbak, mint Marcus. Készítsen C++/OpenGL függvényt, amely megjeleníti Marcust és a sziklát a képernyőn, és diszkrét idejű ütközésdetektálási eljárással eldönti, hogy a szikla eltalálja-e Marcust. A függvény bemeneti paraméterei:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Marcust definiáló háromszögek tömbje (Tomb hMarcus), Marcus jelenlegi állapotában;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;a sziklát definiáló háromszögek tömbje (Tomb hSzikla), a szikla referencia állapotában;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;a szikla jelenlegi helyzetét és orientációját definiáló homogén lineáris transzformáció (float tSzikla[4][4]).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Akkor mondjuk, hogy Marcust a szikla eltalálja, ha a szikla AABB-je (axis-aligned bounding box) Marcus valódi geometriájával ütközik (azaz az AABB Marcus bármely belső pontját tartalmazza). Feltételezheti, hogy Marcust definiáló háromszögháló zárt felület. Ütközés esetén a függvény TRUE értékkel tér vissza, egyébként FALSE-szal. Az ütközés felismeréshez használja fel az előző feladat Vagas függvényét. Marcus textúra azonosítója tMarcus, a szikláé tSzikla. A textúra kép betöltésével és a kamera, illetve az ablak beállításával nem kell foglalkozni. A következő OpenGL függvényeket alkalmazza: glBegin, glEnd, glVertex3d, glTexCoord2d, glBindTexture. Segítség: A sziklák és Marcus kövérségére vonatkozó feltétel arra utal, hogy nem kell foglalkozni azzal az esettel, amikor Marcus teljes egészében tartalmazza a sziklát. A Marcus magasságára vonatkozó megjegyzés szerint viszont előfordulhat, hogy egy szikla Marcus háromszöglistájának egyetlen csúcspontját sem tartalmazza, mégis ütközik vele, mert Marcus háromszögei metszik a szikla AABB-jét.*&lt;br /&gt;
* Az inkrementációs képszintézis 94. feladatának dolgait (Vagas függvény, Tomb metódusai, stb.) használtam. A feladatban a szikla textúrájának és transzformációjának neve ugyanaz volt, ezért a textúrákat átneveztem tex*-ra, a transzformációt trans*-ra.&lt;br /&gt;
* Először kiszámítjuk a (transzformált) szikla AABB-jét. Ehhez végigmegyünk mindegyik háromszögének mindegyik csúcsán, és megkeressük mindegyik koordinátának a maximumát és minimumát (min és max függvények a vektorokon koordinátánként működnek). A maximális koordináták lesznek az egyik sarka a bennfoglaló téglatestnek, a minimálisak a másik. Majd, erre a téglatestre vágjuk Marcus összes háromszögét, és megnézzük, van-e olyan háromszög, ami (legalább részben) beleesik a szikla AABB-jébe: ha van, ütköztünk, ha nincs, nem.&lt;br /&gt;
* Ezután egyszerűen kirajzoljuk mindkettőt, majd visszaadjuk, volt-e ütközés.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void draw(Tomb triangles, int tex, float trans[4][4]) {&lt;br /&gt;
  glBindTexture(tex);&lt;br /&gt;
  glBegin(GL_TRIANGLES);&lt;br /&gt;
  for (int i=0; i&amp;lt;hSzikla.Size(); i++) {&lt;br /&gt;
	 for (int j=0; j&amp;lt;3; j++) {&lt;br /&gt;
		Vector v=triangles.Elem(i).T(j);&lt;br /&gt;
		glTexCoord2d(v.x, v.y);&lt;br /&gt;
		v=triangles.Elem(i).P(j).transform(trans);&lt;br /&gt;
		glVertex3d(v.x, v.y, v.z);&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
  glEnd();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool marcus(Tomb hMarcus, Tomb hSzikla, float transSzikla[4][4]) {&lt;br /&gt;
  Vector AABBmax(-FLOAT_MAX, -FLOAT_MAX, -FLOAT_MAX);&lt;br /&gt;
  Vector AABBmin(FLOAT_MAX, FLOAT_MAX, FLOAT_MAX);&lt;br /&gt;
  Tomb temp;&lt;br /&gt;
  bool collision=false;&lt;br /&gt;
  for (int i=0; i&amp;lt;hSzikla.Size(); i++) {&lt;br /&gt;
	 for (int j=0; j&amp;lt;3; j++) {&lt;br /&gt;
		Vector v=hSzikla.Elem(i).P(j).transform(transSzikla);&lt;br /&gt;
		AABBmax=max(AABBmax, v);&lt;br /&gt;
		AABBmin=min(AABBmin, v);&lt;br /&gt;
	 }&lt;br /&gt;
  }&lt;br /&gt;
  Vagas(hMarcus, AABBmin, AABBmax, &amp;amp;temp);&lt;br /&gt;
  if (temp.Size()&amp;gt;0) collision=true;&lt;br /&gt;
  draw(hSzikla, texSzikla, transSzikla);&lt;br /&gt;
  float identity[4][4]={{1, 0, 0, 0},{0, 1, 0, 0}{0, 0, 1, 0}{0, 0, 0, 1}};&lt;br /&gt;
  draw(hMarcus, texMarcus, identity);&lt;br /&gt;
  return collision;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[KisGergelyG|G]] - 2008.12.26.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Infoalap]]&lt;/div&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
</feed>