<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Software-Entwicklung Service</title>
	<atom:link href="http://www.luxorbis.org/software/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.luxorbis.org/software</link>
	<description></description>
	<pubDate>Tue, 07 Oct 2008 10:24:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Vektor Trivia</title>
		<link>http://www.luxorbis.org/software/?p=15</link>
		<comments>http://www.luxorbis.org/software/?p=15#comments</comments>
		<pubDate>Fri, 28 Dec 2007 10:03:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Offene Grafik-Bibliothek]]></category>

		<guid isPermaLink="false">http://www.luxorbis.org/software/?p=15</guid>
		<description><![CDATA[Vektoren sind ein essenzieller Bestandteil der 3D-Computer-Grafik. Zum grundlegenden Verständnis von Vektoren gibt es im Netz jede Menge Seiten. Das Entwickeln einer eigenen Vektor-Klasse ist nicht nötig, die Standard-Bibliothek bringt eine für Geschwindigkeit optimierte Klasse schon mit: std::valarray. Die angebotene Funktionalität dieser Klasse ist für 3D-Grafik mehr als ausreichend.

In diesem Beitrag sind nur Kodefragmente angeführt, [...]]]></description>
			<content:encoded><![CDATA[<p>Vektoren sind ein essenzieller Bestandteil der 3D-Computer-Grafik. Zum grundlegenden Verständnis von Vektoren gibt es im Netz jede Menge <a href="http://de.wikipedia.org/wiki/vektor" target="_blank">Seiten</a>. Das Entwickeln einer eigenen Vektor-Klasse ist nicht nötig, die Standard-Bibliothek bringt eine für Geschwindigkeit optimierte Klasse schon mit: <a href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/classstd_1_1valarray.html" target="_blank">std::valarray</a>. Die angebotene Funktionalität dieser Klasse ist für 3D-Grafik mehr als ausreichend.<br />
<span id="more-15"></span><br />
In diesem Beitrag sind nur Kodefragmente angeführt, zum Übersetzen müssen diese in folgende Funktion kopiert werden:<br />
<code><br />
#include &lt;iostream&gt;<br />
#include &lt;valarray&gt;<br />
&nbsp;<br />
int main()<br />
{<br />
&nbsp;&nbsp;// Hier die Kodefragmente hineinkopieren<br />
}<br />
</code><br />
Neben anderen Konstruktoren gibt es einen, der Daten aus einem eingebauten Feld kopiert:<br />
<code><br />
float init[] = {1.1f, 2.4f, 3.8f};<br />
std::valarray&lt;float&gt; vector(init, 3);<br />
&nbsp;<br />
for (size_t i(0); i &lt; vector.size(); ++i)<br />
&nbsp;&nbsp;std::cout &lt;&lt; vector[i] &lt;&lt; &quot; &quot;;<br />
&nbsp;<br />
std::cout &lt;&lt; std::endl;<br />
</code><br />
Viele Operatoren und ein paar nützliche kleine Funktionen sind zum Rechnen mit den Vektoren definiert:<br />
<code><br />
float init[] = {1.1f, 2.4f, 3.8f, -3.9f, 4.8f, -5.7f};<br />
std::valarray&lt;float&gt; vector1(init, 3), vector2(init + 3, 3), result(3);<br />
&nbsp;<br />
result = vector1 + vector2;<br />
&nbsp;<br />
for (size_t i(0); i &lt; result.size(); ++i)<br />
&nbsp;&nbsp;std::cout &lt;&lt; result[i] &lt;&lt; &quot; &quot;;<br />
&nbsp;<br />
std::cout &lt;&lt; std::endl<br />
&nbsp;&nbsp;&lt;&lt; result.sum() &lt;&lt; std::endl<br />
&nbsp;&nbsp;&lt;&lt; result.min() &lt;&lt; std::endl<br />
&nbsp;&nbsp;&lt;&lt; result.max() &lt;&lt; std::endl;<br />
</code><br />
Einen Vektor umdrehen/invertieren ist mit einer der beiden folgenden Zeilen leicht möglich:<br />
<code><br />
result = -vector;<br />
result = vector * -1;<br />
</code><br />
Wirklich interessant wird es bei komplexeren Aufgaben. Folgende Zeilen liefern den Betrag eines Vektors und das Kreuzprodukt zweier Vektoren:<br />
<code><br />
result = sqrt((vector * vector).sum());<br />
result = vector1.cshift(1) * vector2.cshift(-1) - vector1.cshift(-1) * vector2.cshift(1);<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.luxorbis.org/software/?feed=rss2&amp;p=15</wfw:commentRss>
		</item>
		<item>
		<title>Grundlagen schaffen</title>
		<link>http://www.luxorbis.org/software/?p=5</link>
		<comments>http://www.luxorbis.org/software/?p=5#comments</comments>
		<pubDate>Wed, 22 Aug 2007 19:53:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Offene Grafik-Bibliothek]]></category>

		<guid isPermaLink="false">http://www.luxorbis.org/software/?p=5</guid>
		<description><![CDATA[Die Programmierung dreidimensionaler Grafik-Anwendungen ist keine triviale Angelegenheit. Gerade am Anfang sind einige Hürden zu nehmen. Dieser mehrteilige Kurs möchte einen kleinen Einblick in die Welt der 3D-Computer-Grafik geben.

Ganz am Anfang steht die Wahl der Werkzeuge und der Grafik-Bibliothek. Die für diesen Kurs verwendete Entwickler-Plattform ist ein aktueller PC, die Linux-Distribution Ubuntu Version 7.04, der [...]]]></description>
			<content:encoded><![CDATA[<p>Die Programmierung dreidimensionaler Grafik-Anwendungen ist keine triviale Angelegenheit. Gerade am Anfang sind einige Hürden zu nehmen. Dieser mehrteilige Kurs möchte einen kleinen Einblick in die Welt der 3D-Computer-Grafik geben.<br />
<span id="more-5"></span><br />
Ganz am Anfang steht die Wahl der Werkzeuge und der Grafik-Bibliothek. Die für diesen Kurs verwendete Entwickler-Plattform ist ein aktueller PC, die Linux-Distribution Ubuntu Version 7.04, der Übersetzer g++/make und die <a href="http://www.opengl.org" title="Offene Grafik Bibliothek" target="_blank">Offene Grafik-Bibliothek</a>. Die Programmier­­sprache ist C++, grundlegende Kenntnisse dieser Sprache sind für den Kurs vorteilhaft aber nicht unbedingt nötig. Der Quelltext hält sich an den ANSI/ISO/IEC 14882:1998 Standard und sollte somit mit allen aktuellen Übersetzern harmonieren. Ein kleiner Teil des Quelltextes ist immer von der jeweiligen Plattform abhängig, im Kurs wird nur Linux berücksichtigt. Die Portierung auf andere Plattformen sollte aber relativ einfach sein.</p>
<p>Um Grafik darstellen zu können benötigt man eine leere Zeichenfläche. Fast alle Betriebssysteme bieten Funktionen zum Öffnen sogenannter Fenster an, die man auch zum Zeichnen verwenden kann. Ubuntu verwendet das <a href="http://xorg.freedesktop.org" title="X-Fenster-System" target="_blank">X-Fenster-System</a>, dazu gibt es eine Schnittstelle für die Programmiersprache C, <em>xlib</em> genannt mit umfangreicher <a href="http://xorg.freedesktop.org/wiki/ProgrammingDocumentation" title="X-Bibliothek Dokumentation" target="_blank">Dokumentation</a>. Die entsprechenden Entwickler-Pakete heißen <em>libx11-dev</em> und <em>libgl1-mesa-dev</em>. Weiters müssen die Pakete <em>g++</em> und <em>make</em> installiert sein.</p>
<p>Zum jeweiligen Kursabschnitt gibt es immer ein Archiv mit den Quelltexten. Diese kann man in einem Terminal mit dem Befehl <em>make</em> (im Quelltext-Verzeichnis) in eine ausführbare Datei übersetzen. Eine gute Ordnerstruktur hilft, den Überblick zu behalten! <img src='http://www.luxorbis.org/software/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Das erste Projekt ist eine minimale Grafik-Anwendung und dazu gedacht die Funktionalität der benötigten Biblitheken zu testen (<a href="http://www.luxorbis.org/software/wp-content/projekt-1.zip" title="Quelltexte Projekt 1">Quelltexte Projekt 1</a>). Sind alle Bibliotheken richtig installiert dann sollte nach dem übersetzen und starten des Projektes 1 das am Ende des Beitrags eingefügte Fenster erscheinen.</p>
<p>Nun zu den einzelnen Dateien:</p>
<p><em>Makefile</em><br />
Dient als Konfigurations-Datei für das Werkzeug <em>make</em>. Die Zeilen 1-5 definieren Variablen, die zur Übersetzung benötigt werden. Die Quelltext-Dateien müssen in Zeile 4 eingetragen werden. Die drei folgenden Zweizeiler definieren Regeln, nach denen die Übersetzung abläuft. Interessierte Leser finden im Netz eine detaillierte <a href="http://www.gnu.org/software/make" title="Dokumentation Werkzeug make" target="_blank">Beschreibung</a>.</p>
<p><em>Start.h/.cpp</em><br />
Jede Anwendung hat eine Funktion, die als Ausgangspunkt des Programmablaufes dient. Für C/C++ ist das die Funktion <em>int main()</em> oder <em>int main(int argc, char** argv)</em>, je nachdem ob man Argumente übergeben will oder nicht. Wie man in Zeile 5 von <em>Start.cpp</em> sehen kann, wird nur die Funktion <em>Create()</em> mit einem temporären Objekt aufgerufen. Die Parameter bedeuten von links nach rechts: Breite des Fensters, Höhe des Fensters, Name in der Titelleiste. Für Fragen rund um C++ gibt es eine <a href="http://www.parashift.com/c++-faq-lite" title="Häufige Fragen für C++" target="_blank">gute Seite</a> im Netz.</p>
<p><em>Canvas.h/.cpp</em><br />
Die in <em>Canvas.cpp</em> definierte Funktion <em>Create()</em> öffnet ein X-Fenster, das spezielle Anforderungen erfüllen muß. Die Funktionen sind in der Dokumentation zur <em>xlib</em> (siehe oben) detailliert beschrieben. Diese beiden Dateien sind die einzigen plattformspezifischen, weshalb eine Portierung für versierte Programmierer nicht allzu schwer sein sollte. In der Ereignis-Schleife werden hier nur drei Ereignisse behandelt: <em>windowClose</em> in Zeile 86 ist kosmetischer Natur und nimmt dem Fenster-Manager das Schließen des Fensters ab, <em>Expose</em> in Zeile 90 wird aufgerufen, wenn das Fenster teilweise oder ganz neu gezeichnet werden muß und <em>ConfigureNotify</em> in Zeile 95 meldet eine Änderung der Fenstergröße.</p>
<p><em>Scene.h/.cpp</em><br />
In diesen Dateien steht der eigentliche Quelltext zum Zeichen mit der offenen Grafik-Bibliothek. Die Struktur folgt der <em>Singleton-Vorlage</em>, es ist nur eine Instanz/ein Objekt dieser Klasse möglich. Die Funktion <em>Get()</em> ermöglicht den globalen Zugriff auf diese Instanz. Der Konstruktor wird genau einmal aufgerufen und ist somit der ideale Platz für die Initialisierung: Die Funktion <em>glShadeModel(GL_FLAT)</em> schaltet auf einfärbiges Füllen der Flächen um. Wie man hier sieht, beginnen alle Funktionen der offenen Grafik-Bibliothek mit dem Präfix <em>gl</em> und sind somit leicht zu erkennen. Die Funktion <em>Display()</em> zeichet einen sogenannten Dreiecks-Fächer (siehe GL_TRIANGLE_FAN) wobei jeweils drei <em>glVertex2f()</em> Funktionen ein Dreieck zeichnen. Die Parameter von links: X-Koordinate, Y-Koordinate (die Z-Koordinate ist hier 0). Die Funktion <em>glColor3f()</em> definiert die aktuelle Farbe zum Zeichnen. Die Parameter von links: Rot-Anteil, Grün-Anteil und Blau-Anteil angegeben durch Werte zwischen 0 und 1. <em>glBegin()</em> und <em>glEnd()</em> müssen einleitend und abschließend die Zeichen-Funktionen begrenzen. Die Funktionen im <em>Reshape()</em> Abschnitt kann man <a href="http://www.glprogramming.com/red" title="Rotes Buch" target="_blank">im Netz</a> nachlesen.</p>
<p>Wie man an diesem ersten Kursteil sieht, werden die Details nicht genau beschrieben. Für Anfänger ist zusätzlich viel Recherche im Netz nötig. Leider sind die meisten Seiten nur in englischer Sprache verfügbar. Zum Schluß noch ein Bildschirmfoto der Anwendung.</p>
<p style="text-align: center"><img src="http://www.luxorbis.org/software/wp-content/projekt-1.png" alt="Bildschirmfoto Projekt 1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.luxorbis.org/software/?feed=rss2&amp;p=5</wfw:commentRss>
		</item>
	</channel>
</rss>

