Zeichnen eines 3D-Bereich in C/C++
Ich bin auf der Suche nach einem Algorithmus, der zeichnen kann, eine gut aussehende 3D-Kugel auf kleinen Auflösung. Ich fand Bresenham-Kreis-Algorithmus aber es ist für 2D-Zeichnungen. Ich brauche nur Sphären Grenzen (ich brauche es nicht gefüllt). Ich habe auch mal gegoogelt, eine Lösung für das problem, aber ich habe nichts gefunden. Diese Artikel nicht hilft (was ist die brute-force-Algorithmus?). Ich kann nicht alle OpenGL-Bibliotheken, die ich brauche Vanille C/C++ - Lösung. Vielen Dank im Voraus.
- Ich habe Angst, dass deine genannten problem keine Lösung hat. C/C++ nicht definiert standard-Grafik-Bibliotheken. Ich bin auch ein wenig überrascht, dass Sie sich noch nicht entschieden, welche Sprache zu verwenden, noch.
- Was ist falsch mit dem Kreis zeichnen? Die Grenze eines 3D-Bereich IST ein cricle.
- Ich bin Programmierung in C, aber es gibt nicht einen großen Unterschied zwischen den beiden Sprachen, so auch wenn jemand zeigt code in C++ es wird nicht schwer sein, geschrieben in C. die Anderen Sprachen sind auch willkommen, ich möchte, um herauszufinden, die Idee!
- Sie scheinen das noch immer nicht zu sein, die Anerkennung der Unmöglichkeit, das, was Sie Fragen
- Ich Schreibe es für mich und beweisen, u es ist möglich,.
- Es ist nicht möglich, einige Menschen zu helfen. Hier kommt mein downvote.
- Was Sie brauchen, ist aufgerufen, eine Kugel mit Mosaik-Algorithmus, es gibt Tonnen von tutorials für die, die es gibt. Sie können die Umsetzung eines solchen Algorithmus in einem modeling Programm die scripting-Sprache; Sie brauchen nicht zu zeichnen, überhaupt nichts.
- Da das erklärte Ziel der Frage ist, zeichnen Sie eine Kugel, ich denke, Ihr Kommentar ist ein wenig schwer zu verstehen
- Nochmal Lesen, er fragt nach einem Algorithmus, der zeichnen kann, eine Kugel, nicht, dass er unbedingt will, ziehen die Sphäre selbst.
- OK. Ein Algorithmus, der zeichnen kann, ist ein bisschen ein non-sequitur, wohlgemerkt.
- was ist Ihre imaging-Ziel-Gerät? LED-cube? (gefüllt oder nur die Oberfläche mit, was organisation) oder Sie "Rastern", um Arrays oder wo ? auch die Auflösung ist ziemlich wichtig. Fügen Sie diese Angaben mit einem Beispiel, wie das Rendern ganz einfach in Ihre Plattform, so dass es möglich ist, zu beantworten (ohne diese info Sie erhalten unten/in der Nähe Stimmen die ganze Zeit)
- Bitte stop-ripping auf diesen Kerl für für die besagt, dass er auf der Suche nach einer Bibliothek unabhängige Lösung. Offensichtlich, was er meint ist, dass er auf der Suche nach einem Weg, um erzeugen ein array von voxels Darstellung der Sphäre, die Sphäre, ohne die Verwendung einer Bibliothek, so kann er, konzipieren die Prozess-und dann setzen Sie es sich mit einem standard-openGL-Bibliothek. Also, bitte nicht downvote diese gültige post, nur weil es der Ersteller nicht Wort seine Gedanken perfekt genug.
Du musst angemeldet sein, um einen Kommentar abzugeben.
wenn ich das richtig Sie wollen auf die Darstellung aller Oberflächen-Voxel-Sculpting-sphere -
Brute-force ist
O(R^3)
. Wenn Sie nur Projekt-Strahlen aus dem Flugzeug und berechne die 3-TEN Koordinate, dann bekommen SieO(R^2)
aber stellen Sie sicher, dass keine Voxels fehlen Sie zu tun haben, diese Projektion für alle 3 Ebenen, die nochO(R^2)
Es so Aussehen:
auf LED-Würfel
16x16x16
simulation. Nun den Algorithmus:berechnen sichtbaren bounding-box
kein müssen ganze Rendern rendering-Raum nur die Sphäre also center +/- radius...
nehmen einer Ebene (XY-Beispiel)
Cast Strahlen aus allen
x,y
Punkte innerhalb bounding-box, die ist nur 2 for-Schleifen und die Berechnung derz
Koordinaten, wo der Strahl trifft über die Sphäre Gleichung:so
und machen die beiden voxels. Die
int sqrt(int x)
für begrenzte Größe (wie LED-Würfel/Bildschirm oder Voxel-Raum) erfolgt über LUT lookup-Tabelle um die Dinge zu beschleunigen.tun, der Schritt #2 für alle Ebenen (
xy,yz,xz
)Den code in C++ sieht wie folgt aus:
Klasse Verwendung:
Wenn Sie verwenden möchten C nur dann zerlegen Klasse nur Globale Funktionen und Variablen und übersetzen C++ Betreiber
x++,--,+=,-=,*=,...
zu C Stilx=x+1,...
Basierend auf dem link, es sieht aus wie Sie sind mehr daran interessiert, in voxel-algorithmen für Kugeln, anstatt Grafiken per se; so etwas sagen, wie auf dieser Seite hilft mit. Wollen Sie nicht eine Kugel, aber die Oberfläche nur.
Midpoint circle Algorithmus kann verwendet werden zum zeichnen von 3D-voxel-Bereich: betrachten Sie die Kugel als einen Stapel von Segmenten, und jedes Segment enthält einen Kreis.
In der Praxis, verwenden Sie zwei geschachtelte Mittelpunkt Kreisen, die äußeren radius definiert werden, die für die innere. (Obwohl ein naiver Algorithmus für Kreise auf der jeweils anderen wahrscheinlich verlassen Löcher in den voxels, der midpoint circle Algorithmus nutzt Symmetrien, und, wenn richtig umgesetzt, keine solche Löcher auftreten sollten.)
Bauen Sie sechs caps im tandem, wie schnitzen einen Würfel in eine Kugel. Da die Oberfläche hängen auf jeden cap sind immer kleiner als 1, geht nach außen auf ein cap wird bei den meisten ändern jede Koordinate um 1, so dass Löcher nicht auftreten.
Das problem bei diesem Ansatz ist die Komplexität: jeder Punkt, den Sie berechnen betreffen kann bis zu 48 voxel-Zellen. (An jedem cap, jeder Punkt berechnet wird, innerhalb eines oktanten, und betrifft somit acht Zellen. Es gibt sechs Kappen, und 6*8=48.)
Schlage ich einen anderen Ansatz.
Die Gleichung für die Oberfläche von r-radius Kugel zentriert auf x0, y0, z0, ist
Mit integer-coordinater, die grid-Punkte werden nur selten genau auf der Kugeloberfläche, ermöglichen eine Reihe von Werten:
,, wobei RRMIN und RRMAX sind Konstanten; insbesondere werden die minimum-und maximum-distance-squared auf den Bereich center.
Empfehle ich verdoppelt Koordinaten für Allgemeine Fälle. Diese können Sie auswählen, ob das Zentrum der Kugel ist zentriert auf die Koordinaten (bzw. die ungeraden Durchmesser), oder in der Mitte zwischen zwei benachbarten cordinates (was auch Durchmesser).
Wenn Sie eine
SIZE
×SIZE
×SIZE
raster des voxels (Lichter, building blocks, was auch immer), danngibt 1 zurück, wenn der Punkt (
x
,y
,z
) ist innerhalb der region Oberfläche der Kugel sich mittig im Würfel. (Technisch gesehen gibt es, wenn der Abstand von diesem Punkt zur Mitte dessize
-size-cube ist innerhalbsqrt(rrmin)/2
undsqrt(rrmax)/2
inklusive.)Den "richtigen" Werte
rrmin
undrrmax
sind stark Kontext-abhängig.rrmax
ist in der Regel irgendwo in der Nähesize*size
(denken Sie daran, die Funktion verdoppelt-Koordinaten), mitrrmin
etwas weniger.Zum Beispiel, wenn Sie eine 3×3×3-raster,, Sie wollen nur das sechs-center-Zellen auf jedes Gesicht zur Erfüllung der Bedingung; Sie können tun, dass mit
size=3
,rrmin=1
,rrmax=4
:Wenn Sie eine 4×4×4 raster, Sie wollen die vier center-Zellen auf jedes Gesicht zur Erfüllung der Bedingung (also insgesamt 24 von 64 Zellen sind als auf der Kugeloberfläche); Sie können tun, dass mit
size=4
,rrmin=11
,rrmax=11
:Mit einem 5×5×5 raster, kommen wir zu der interessanten Nebenwirkungen des oben beschriebenen Algorithmus.
size=5
,rrmin=8
,rrmax=16
ergibt sich eine sehr "eckig" - Bereich, fast ein Würfel steht auf einer Ecke:size=5
,rrmin=12
,rrmax=20
Erträge meiner Lieblings Ungefähre Sphäre:size=5
,rrmin=16
,rrmax=24
ergibt sich eine abgerundete Würfel (auf jeder Seite eine 3×3-Wohnung):Offensichtlich, mit
rrmin=0
umfasst alle inneren Zellen, zu, was zu einem ball, statt nur die Oberfläche einer Kugel.Als die grid-Größe erhöht, je mehr Varianten jeder Größe Kugel können Sie stellen.
Die obige Funktion ist besonders nützlich auf dem mikrocontroller, da kann man einfach eine Schleife durch Ihre Gitter, die Aktualisierung der Staat an jedem Punkt, wie Sie es wünschen. Außerdem, die meisten mikrocontroller dicht auf den Speicher, haben aber sehr schnell (single-clock) addition, Subtraktion, und Multiplikation Anweisungen. (Obwohl ein 16×16-bit-Multiplikationen mit 32-bit-Ergebnis dauert in der Regel zwei oder mehr Anweisungen.)
Einen typischen mikrocontroller nicht über den ROM/flash-Funktion, um genug interessante voxel-Muster, und nur ein paar DMA-Fähigkeit von einer SD-Karte über SPI (so konnte man nur laden "frames" voxel-Muster von einer microSD-Karte), funktioniert aber wie die oben genannten erzeugen können interessante Formen mit wenigen Eingaben-und vor allem-Eingänge können Sie interpolieren.
Den oben beschriebenen Funktionen können auch angepasst werden angenähert antialising (durch den Vergleich
rr
zurrmin
undrrmax
), falls Ihr voxels werden nicht nur binäre, sondern z.B. PWM-gesteuerte LEDs.Da die Visualisierung des oben ist in der Regel ein bisschen schwierig, hier ist der quick-hack, die ich verwendet, um die oben genannten Bilder. Es gibt eine SVG-Grafik auf der standard-Ausgabe und ASCII-Scheiben standard-Fehler, wenn angegeben
size
,rrmin
, undrrmax
als Kommandozeilen-Parameter.Ich wollte nicht stören, finesse den Ausgang; Sie können ganz einfach wählen Sie z.B. verschiedene Farben für jedes Gesicht, vielleicht Schatten hinzufügen, um den hintergrund Flugzeuge, et cetera.
Die obigen Bilder wurden mit diesem Programm erstellten, dann in PNG mit GIMP, aber ich empfehle, mit Ihrem browser zum anzeigen der generierten Dateien lokal.
Fragen?
die häufigste verwendete Bibliothek in diesem Bereich ist openGL
und diese dia-show, wie Sie zu konfigurieren ist die Bibliothek auf Ihre IDE laden Sie die Dateien von hier
http://www.xmission.com/~nate/glut.html
dann setzen Sie in diesem Wege
glut32.dll -> C:\Windows\System32
glut32.lib -> C:\Program Files\Microsoft Visual Studio .NET\Vc7\PlatformSDK\lib
glut.h -> C:\Program Files\Microsoft Visual Studio .NET\Vc7\PlatformSDK\Include\gl
opengl superbible-4. dies ist ein lehrbuch erstaunliche ein von Grund auf neu starten, um das advanced level
Bedeutet das, dass keine Grafik-Bibliotheken überhaupt? In diesem Fall ist die sehr einfache Antwort ist: Sie nicht. Weder C noch C++ native Grafik-rendering aufgenommen. Sie müssen Verwendung eines externen Bibliotheken und Treiber nur, um in Kontakt mit der OS' frame-buffer und/oder Grafikkarte.
Jedoch, wie für meine nicht Grafik bezogene Lösung, es hängt davon ab:
Bedeutet dies, dass Sie buchstäblich müssen nur die Sphäre Grenzen? Da in diesem Fall, Sie sollten benutzen Sie einfach die 2d-Zeichnung-Algorithmus, die Sie bereits haben, da es Ihnen die Grenzen rechts und dann dort.
Wenn es heißt, Sie wollen die einzelnen voxels der Kugel, es ist ein wenig komplizierter und Bedarf ein wenig mehr Mathematik, und möglicherweise in dem Maße, wo ein software-renderer ist nur gehen, um einen Schlag in das Gesicht in Bezug auf Leistung, je nachdem, wie viele voxels und die einzelnen Eckpunkte Ihres Sphäre hat.
Was ich denke, Sie versuchen zu bekommen, ist, was Spiel und Physik-engine-Entwickler eine "bounding-box" oder "collision-box", manchmal auch als nur "hitbox". All das verlangt, ist die Zeichnung eines Würfels (in der Regel Draht), welches die Gesamtheit der Sphäre und nichts mehr (In anderen Worten, Sie ziehen Sie einfach ein Würfel mit der gleichen Breite, Höhe und Tiefe als die Sphäre, vorausgesetzt, wir arbeiten mit einer X -, Y-und Z-dimension).