Voglio disegnare una sfera 3D o una sfera nella tela HTML 5.0. Voglio capire l'Algoritmo su come disegnare una sfera 3D. Chi può condividere questo con me?Come disegnare una sfera 3D?
risposta
Bene, l'immagine di una sfera avrà sempre una forma circolare sullo schermo, quindi l'unica cosa che conta è l'ombreggiatura. Questo sarà determinato da dove posizioni la tua fonte luminosa.
Per quanto riguarda gli algoritmi, ray tracing è il più semplice, ma anche il più lento di gran lunga — quindi probabilmente non vorrebbe usarlo per fare qualsiasi cosa molto complicata in un <CANVAS>
(soprattutto in considerazione della mancanza di accelerazione grafica disponibili in quell'ambiente), ma potrebbe essere abbastanza veloce se si volesse fare una singola sfera.
dato che la fonte di luce non cambia, può anche prestarlo e basta blittare una bitmap; ^) – Toad
È necessario modellare una sfera e farla variare di colori in modo che, ruotando, si possa vedere che non è solo una sfera, ma viene renderizzata.
In caso contrario, una sfera nello spazio, con un punto di riferimento diverso attorno ad esso, sembra un cerchio, se è tutto un colore solido.
Per iniziare vorrai provare a disegnare un cerchio con dei rettangoli, poiché questa è la principale primitiva che hai.
Una volta compreso come farlo, o creare una nuova primitiva, ad esempio un triangolo, utilizzando il metodo Path e creare un cerchio, sei pronto per spostarlo in 3D.
3D è solo un trucco, come si prenderà il modello, probabilmente generato da un'equazione, e quindi appiattirlo, come si determina quali parti saranno visibili e quindi visualizzarlo.
Tuttavia, è necessario modificare il colore dei triangoli in base a quanto sono lontani da una fonte di luce, nonché in base all'angolo di tale parte rispetto alla fonte di luce.
Qui è dove è possibile iniziare a fare ottimizzazioni, come, se si esegue questo pixel per pixel, si è raytracing. Se hai blocchi più grandi e una fonte puntiforme di luce, e l'oggetto ruota ma non si muove, puoi ricalcolare come cambia il colore per ogni triangolo, quindi è solo questione di cambiare i colori per simulare la rotazione.
L'algoritmo dipenderà dalle semplificazioni che si desidera apportare, in modo da ottenere esperienza ritorna e chiedere, mostrando ciò che hai fatto finora.
Ecco un esempio di come farlo, e di seguito ho copiato la parte di sfera 3D, ma per favore guarda l'intero article.
function Sphere3D(radius) {
this.point = new Array();
this.color = "rgb(100,0,255)"
this.radius = (typeof(radius) == "undefined") ? 20.0 : radius;
this.radius = (typeof(radius) != "number") ? 20.0 : radius;
this.numberOfVertexes = 0;
// Loop from 0 to 360 degrees with a pitch of 10 degrees ...
for(alpha = 0; alpha <= 6.28; alpha += 0.17) {
p = this.point[this.numberOfVertexes] = new Point3D();
p.x = Math.cos(alpha) * this.radius;
p.y = 0;
p.z = Math.sin(alpha) * this.radius;
this.numberOfVertexes++;
}
// Loop from 0 to 90 degrees with a pitch of 10 degrees ...
// (direction = 1)
// Loop from 0 to 90 degrees with a pitch of 10 degrees ...
// (direction = -1)
for(var direction = 1; direction >= -1; direction -= 2) {
for(var beta = 0.17; beta < 1.445; beta += 0.17) {
var radius = Math.cos(beta) * this.radius;
var fixedY = Math.sin(beta) * this.radius * direction;
for(var alpha = 0; alpha < 6.28; alpha += 0.17) {
p = this.point[this.numberOfVertexes] = new Point3D();
p.x = Math.cos(alpha) * radius;
p.y = fixedY;
p.z = Math.sin(alpha) * radius;
this.numberOfVertexes++;
}
}
}
}
Questi esempi sono sorprendenti.Sebbene suggeriscano di visualizzarli in Chrome, l'immagine con la bandiera ondeggiante e l'iPhone (renderer predefinito) hanno funzionato piuttosto bene in Safari. –
Penso che Chrome sia solo perché potrebbe essere più veloce, ma ora Safari 4, Firefox 3.5, Chrome e Opera 10 dovrebbero essere in grado di mostrarli bene. –
Dead link (intero dominio). – brichins
Aggiornamento: Questo codice è piuttosto vecchio e limitato. Ci sono biblioteche per fare 3D sfere ora: http://techslides.com/d3-globe-with-canvas-webgl-and-three-js/
oltre dieci anni fa ho scritto un applet Java per rendere una sfera strutturato dalla realtà facendo i calcoli per capire dove la superficie della sfera è stato nella scena (non usare i triangoli).
Ho riscritto in JavaScript per tela e ho un demo rendering the earth as a sphere:
alt text http://sam.haslers.info/render-sphere/JavaScript+Canvas.png
I Get Around 22 fps sulla mia macchina. Il che è tanto veloce quanto la versione di Java su cui si basava il rendering, se non un po 'più veloce!
Ora è passato molto tempo da quando ho scritto il codice Java - ed era abbastanza ottuso - quindi non ricordo esattamente come funziona, l'ho appena portato in JavaScript. Tuttavia questo è da una versione lenta del codice e non sono sicuro se la versione più veloce fosse dovuta alle ottimizzazioni nei metodi Java che usavo per manipolare i pixel o dagli speedup in matematica per capire quale pixel rendere dalla struttura. All'epoca ero corrispondente anche a qualcuno che aveva un'applet simile che era molto più veloce della mia, ma ancora una volta non so se alcuni dei miglioramenti di velocità che avevano sarebbero stati possibili in JavaScript, dal momento che avrebbe potuto fare affidamento sulle librerie Java. (Non ho mai visto il loro codice quindi non so come hanno fatto.)
Quindi è possibile migliorare la velocità. Ma questo funziona bene come prova del concetto.
Se siete interessati a confrontare la velocità, le versioni di Java sono qui:
Questi sono collegamenti guasti fino a quando ho prossima aggiornare il mio sito web
- Mine - Instant start, slower to render
- Mine - very slow to start, Much faster render - Questa versione ha anche l'illuminazione. Trascina il mouse su di esso per ruotare l'asse.
- Someone else's - più veloce da avviare, molto più veloce da eseguire.
avrò un andare a convertire la mia versione più veloce po 'di tempo per vedere se riesco a ottenere i miglioramenti di velocità nella versione JavaScript.
La demo JavaScript + Canvas funziona solo con Firefox. Chrome mi dà lo stesso errore di questa domanda: http://stackoverflow.com/questions/982000/firefox-throwing-a-exception-with-html-canvas-putimagedata –
Non ho avuto il tempo di guardare la versione veloce ma ci sono alcuni semplici miglioramenti che arrivano fino a 40fps. –
Questi collegamenti in basso 3 sono morti. – bjb568
Si può provare con la libreria three.js, che astrae molto codice dalla programmazione Webgl principale. Includi la libreria three.js nel tuo html da three.js lib.
u possibile utilizzare tela renderer per il browser Safari, WebGL lavora per Chrome
si prega di trovare il JS FIDDLE FOR SPHERE
var fotocamera, scena, materiale, maglia, geometria, renderer
function drawSphere() {
init();
animate();
}
function init() {
// camera
scene = new THREE.Scene()
camera = new THREE.PerspectiveCamera(50, window.innerWidth/innerHeight, 1, 1000);
camera.position.z = 300;
scene.add(camera);
// sphere object
var radius = 50,
segments = 10,
rings = 10;
geometry = new THREE.SphereGeometry(radius, segments, rings);
material = new THREE.MeshNormalMaterial({
color: 0x002288
});
mesh = new THREE.Mesh(geometry, material);
//scene
;
scene.add(mesh);
// renderer
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
}
function animate() {
requestAnimationFrame(animate);
render();
}
function render() {
mesh.rotation.x += .01;
mesh.rotation.y += .02;
renderer.render(scene, camera);
}
// fn callin
drawSphere();
Finalmente una demo JSFIDDLE. :-) Grazie! –
Creato ne ho solo bisogno, grazie! – JNYJ
- 1. Disegna una sfera usando i pixel 3D (voxel)
- 2. Come disegnare una sovrapposizione 2d su una scena Java 3d?
- 3. proceduralmente generare una sfera maglia
- 4. Come disegnare più cubi 3d in MATLAB
- 5. Javascript: come disegnare una semplice linea su tela (in 3d) e renderla ruotabile (in 3d)?
- 6. Come disegnare Geosfera in matlab?
- 7. Profili di contorno su una superficie a sfera
- 8. Disegno di una sfera in OpenGL ES
- 9. Come creare una semplice sfera 3d per cocos3d usando il frullatore e l'SDK PowerVR
- 10. Punti trama su una sfera in R
- 11. Come disegnare vettori (vettori fisici 2D/3D) in MATLAB?
- 12. Come posso disegnare un oggetto 3D trasparente con SharpDX Toolkit?
- 13. Python/matplotlib: tracciare un cubo 3d, una sfera e un vettore?
- 14. Rilevamento sfera - sfera di collisione -> reazione
- 15. Il volume di una sfera?
- 16. "sfera in un sacchetto" proiezione piano-sfera
- 17. Creazione di una terra 3D ruotabile
- 18. Tracciare un punto sul bordo di una sfera
- 19. Come disegnare una curva parametrica in 3d con smoothing in R?
- 20. Come tracciare 3D Earth in Python?
- 21. Rotazione di una sfera in WebGL
- 22. Dispersione n punti uniformemente su una sfera
- 23. È possibile disegnare un grafico ad area 3D usando jFree?
- 24. Come disegnare una mappa mentale
- 25. Come disegnare su una JLabel?
- 26. traiettoria ottimale sulla superficie di una sfera
- 27. Normali analitici a una sfera spostata con rumore simplex
- 28. Sfera con texture Android
- 29. set di algoritmi di intersezione 3D efficienti
- 30. Come creare una sfera uniforme con triangoli in OpenGL?
Cosa fare significa "sfera 3d"? Intendi ombreggiato? Wireframe? –
Può esserci qualche altro tipo di sfera rispetto a uno 3d? – Rook
Idigas: 4D uno esiste, a quanto pare, tuttavia la sua proiezione visibile è fondamentalmente uguale a quella 3D ma la sua dimensione continua a cambiare. – Esko