Hola, en el episodio de hoy sobre codificando juntos el futuro de los gráficos por computadora [Música] Voy a intentar representar un cubo giratorio tridimensional aquí mismo en la pantalla de esta computadora Apple dos plus. Voy a ver si puedo programarlo. todo en básico, pero antes de comenzar me encantaría resaltar algunos de los maravillosos mensajes que he estado recibiendo de espectadores como tú. Kelly Murphy escribe el nombre de la variable enlace utilizado por Apple basic tiene dos caracteres, ¿ qué significa esto exactamente? Déjame escribir un pequeño programa aquí con una variable llamada inicio X y luego tal vez una variable llamada inicio y si imprimo ambos debería ver 10 y luego 50.
Pero solo veo 50. esto se debe a que lo que la computadora está almacenando es el valor real El nombre de la variable son solo esos dos primeros caracteres que escribe St David Frischneck. Recuerdo haber escrito una lista del programa de trazado de Mandelbrot de una copia de la revista Insider y dejarlo funcionar todo el día mientras estaba en la escuela. Yo también he estado trabajando en un programa de trazado de Mandelbrot en el Apple II plus y les voy a mostrar un lapso de tiempo ejecutándose ahora mismo. Es tan hermoso que muchos de ustedes también mencionaron beagle Brothers basic, que era una utilidad de mejora para un Apple 2E o un 2 o 2 plus con una tarjeta RAM adicional. Una de mis mejoras favoritas que tiene beagle basic es un comando de intercambio que intercambiará dos variables e incluso incluye elf. Muchos de ustedes comentaron que hay una forma de editar una línea de código que ya han escrito además de volver a escribir todo. Mark Miller lo explica porque lo que recuerdo es que tenías que presionar Escape y luego lo básico te permitiría usar las teclas IJ AK y M en el teclado para mover el cursor a la línea que querías editar, así que creo que lo que necesito.
Lo que tengo que hacer es presionar Escape para moverme hacia arriba. Ahora tengo que presionar J para moverme sobre uno y luego no puedo usar JK para moverme entre los personajes. Ahora tengo que cambiar a la tecla de flecha, bueno, primero. presiono escape para no mover el cursor y luego presiono la tecla de flecha hasta aquí ahora podría cambiar este número a 25 ahora puedo presionar ingresar a la lista de inicio aquí vamos He editado una línea de código de Piper Mark Miller Esto va a mejorar enormemente mi vida como programador. También debo mencionar que desde entonces he adquirido algo muy emocionante. Notarás aquí que tengo estas hermosas unidades de disco e innumerables de mis viejos disquetes. Supertexto Daniel Schiffman 4 de diciembre de 1982. beagle básico, ahí está, este es mi proyecto de ciencias de quinto grado. Ella intentó cargar esto y ver si podía ejecutarlo. Desafortunadamente, no he podido hacer que estas unidades de disco funcionen, así que realmente me gustaría restaurarlas para acceder a lo que hay. en estos discos pero mientras tanto he adquirido de Big Mess oh wires algo llamado floppy emu el floppy emu aquí hay un dispositivo que toma una tarjeta SD en la que puedo cargar cualquier imagen de disco Apple II y también puedo escribir en ella, así Puedo cargar programas y escribir en ellos y en esta tarjeta SD básicamente puedo almacenar el equivalente a miles de disquetes y tiene un pequeño menú aquí, así que si voy a Apple 2, iré a cinco y cuarto.
Discos de pulgadas vayamos a los juegos, probemos Frogger y ahora puedes ver que Frogger está cargado en el disquete emu de la misma manera equivalente que lo sería para un disco. Voy a reiniciar la computadora. Puedo ver aquí que está leyendo. Frogger, tenemos la pantalla de inicio aquí, espacio para jugar y aquí vamos. Soy el rey de Frogger, tal vez comience a transmitir estos juegos en mi canal de Twitch. Voy a ir aquí e ir a Apple II, cosas cinco y un disco de un cuarto de pulgada y yo mismo hice una pequeña carpeta llamada shift men y tengo un disco de muestra de Dos que carga un montón de programas de muestra y me permitirá guardar cualquier código que escriba hoy en esta tarjeta SD y liberarlo. Para todos ustedes, lo primero de lo que quiero hablar es de la animación con doble búfer. He hablado un poco sobre esto en videos anteriores e hicimos algo como esto en mi pelota que rebota en un ejemplo básico cada vez que muevo la pelota en el rectángulo. a la siguiente ubicación tuve que borrar la anterior para que no viéramos su rastro, solo vemos este rectángulo moviéndose del punto A a B, de C a D, etc., la mayoría de los bocetos de procesamiento o P5 tienen un dibujo.
El bucle ocurre una y otra vez. nuevamente al comienzo del dibujo, se llama a la función de fondo para borrar el fondo, las cosas se dibujan cuando se vuelve a repetir, el fondo se borra nuevamente, las cosas se dibujan en el fondo, dibujan el fondo, dibujan el fondo, dibujan el fondo, pero no vemos ese parpadeo del fondo, luego colocamos las formas. Esto se debe a que la animación con doble búfer ocurre detrás de escena, la pantalla en realidad no se actualiza hasta el final del bucle de sorteo, por lo que todo eso sucede en un búfer fuera de la pantalla que luego, de una vez, se muestra en la pantalla para que usted pueda verlo.
Si quiero esa misma funcionalidad en un programa básico de Applesoft, tengo que implementar ese doble almacenamiento en búfer yo mismo, así que déjame buscar en mi manual aquí o tal vez en este tutorial donde puedo encontrar información al respecto, ajá, he encontrado la parte de en el manual necesito comandos que afecten a los gráficos para saber que el Apple 2 plus en la memoria tiene dos páginas para gráficos de alta resolución, por lo que una de esas páginas puede estar fuera de la pantalla y puedo dibujar en ella y luego, cuando la pongo en la pantalla. Puedo empezar a usar la otra página, luego puedo intercambiarlas y así es como voy a implementar esto. Puedo introducir la dirección de memoria para mostrar una página frente a la otra, así que lo primero que quiero hacer es iniciar un nuevo programa que ambos inicializan la página uno de gráficos de alta resolución y la página dos de gráficos de alta resolución. Genial, ahí está la línea.
Ahora, ¿qué pasa si lo que quiero hacer es animar la línea moviéndose? Hay un paso más que necesito y está aquí en este póster de Beagle Brothers para seleccionar qué trazado. página que voy a dibujar necesito empujar la dirección 230 32 página 1 64 página dos También he impreso para mí una pequeña referencia con todas las direcciones de empuje correctas que necesito, pensemos en cómo nos vamos a adaptar este programa tiene una línea de animación con animación de doble búfer, comencemos de nuevo por un segundo. ¿ Qué altura tiene la pantalla nuevamente? 192 píxeles. Creo que aquí hay un programa que debería comenzar trazando una línea que se mueve en X y haciéndolo una y otra vez. Vaya, oh, el gráfico H 192 es correcto porque tiene 192 píxeles de alto, pero es de cero a 191, ¿qué estoy pensando? Ahí vamos, así que ahora esta línea se está animando en la pantalla. Si quisiera borrar la línea anterior, podría seguir adelante y hacerlo en última instancia. El objetivo futuro es dibujar este Cubo elaborado y sé que esto no va a ser muy eficiente y probablemente ralentizará enormemente el programa, pero cuando dibujo el cubo prefiero no borrar individualmente cada línea, prefiero simplemente borrar el página completa y puedo hacer eso con una llamada llamada negativa 3086 pantalla clara de alta resolución a Negro, así que eso es lo que quiero hacer y el valor entero positivo de eso es 62450, así que voy a decir en la línea 25 llamar a 62450 y luego vayamos a 25.
Ahora esto no es una animación con doble búfer, este es exactamente el problema que estamos viendo borrar dibujar borrar dibujar ahora necesitamos descubrir cómo hacer este proceso en dos páginas separadas. Voy a tener una variable mantener seguimiento de en qué página estamos o en qué pantalla, así que llamémoslo SC y vamos a pensar en ello como pantalla cero y pantalla uno, entonces, ¿qué pasaría si escribiera una subrutina donde lo primero que hago en una subrutina? es mostrar la página en la que estoy, en realidad lo que he hecho antes, así que sé lo que tengo que hacer en esta subrutina es mostrar la otra página porque quiero que esta subrutina sea la subrutina que intercambia, así que Estoy pensando en ello.
Ya lo saqué de la pantalla. Ahora quiero mostrar esa otra página y comenzar a trabajar con la otra página. Esto tendrá sentido, así que diré " empujar" para que sea 49236 o 49237, esos son dos números enteros que están separados por uno, mi pantalla es cero o uno y, por cierto, puedo convertir cero en uno o uno en cero diciendo no examinado porque en el Apple 2 más falso a cero verdadero es uno, por lo que no uno es cero no cero es uno así que presione cuatro nueve dos tres seis más no SC coma cero para que se muestre la pantalla que no es el valor de la variable SC y luego necesito presionar la dirección de memoria dos tres cero y luego volver a configurar la página que estoy trazando así es 32 o 64, que es lo mismo que 32 más 32 veces SC, cierto, porque si SC es cero, será 32, si SC es 1, será 32 más 32, que es 64.
Entonces, ¿qué haré? en esta subrutina está claro que uno llama seis dos cuatro cinco cero, bueno, veamos nuestro programa, así que deshagámonos de 25 y necesito un retorno [Aplausos], por lo que esta subrutina que comienza con una línea 1000 simplemente cambia la pantalla a la que estamos dibujando. presumiblemente haré eso en la línea 50. y luego en la línea 60 puedo ir a 30 y dibujar nuevamente, veamos qué sucede si ejecuto este hola, entonces, ¿qué está sucediendo aquí? Solo veo una línea porque el valor de SC nunca cambia, así que empiezo con la pantalla cero, dibujo la línea y luego cambio a dibujar en la otra pantalla, pero nunca volví a cambiar, así que en algún lugar de ahí necesito cambiar de pantalla después de dibujar, sí, justo antes de ir a 1000 ah, mira esa apariencia. Al verlo moverse maravillosamente sin parpadear, es muy, muy, muy lento, esto no es un buen augurio para mi Cubo. Ahora siento que por la forma en que lo hice, es una tontería que esta secuela, no SC, no sea parte del subrutina pero estoy triste porque hice esta primera línea de la subrutina línea 1000.
¿Sería una tontería de mi parte hacer esto? No me gusta esto en absoluto, así que mi bucle de dibujo en términos de procesamiento es esencialmente las líneas 30 y 40. entonces Sé que si realmente quiero que esto sea más como ah, más como un procesamiento, ten paciencia conmigo, déjame volver a escribir algo de esto [Música] [Aplausos] [Música] mírame editando, eso es correcto, editar esa línea sí, entonces la línea 25 sería se llama cuál es la dirección para borrar de nuevo seis dos cuatro cinco cero este ahora es mi sorteo Bucle borrar el fondo dibujar una línea mover X entonces necesito ir y oh 999 ya no es sub 1000 entonces esta es la línea de código que es invisible al procesar un P5, lo que entra cambia los buffers, lo cual hago allí, vuelvo y luego repito el bucle de dibujo, eso debe ser, tienes que borrar el fondo, por lo que 60 debería pasar a 25.
Muy bien, aquí vamos, todavía está funcionando. realmente lento, pero estoy muy emocionado de que tengamos animaciones con doble búfer. Esto es increíble. Creo que vamos a necesitar este libro para programar el 6502. Es un lenguaje tan básico que es divertido de usar y realmente fácil para mí de demostrar y explicar, pero también de apretar. Para comprobar la eficiencia de esta computadora, probablemente tendré que empezar a analizar el lenguaje ensamblador. También tengo la sensación, y les mostraré una versión de esto, que si simplemente borrara esa única línea en lugar de borrar todos los gráficos.
buffer también se ejecutaría mucho más rápido, pero eso me parece demasiado trabajo. Sin embargo, ahora estamos listos para ver si podemos comenzar a aplicar algunas transformaciones 3D a esta línea y probablemente verla ejecutarse muy lento y luego podemos hacer un cubo. de un montón de líneas, ¿por qué no? Así que voy a eliminar ahora mismo todo, desde la línea 20 hasta la línea 60. Y comencemos rotando una sola línea. Ahora sé que eventualmente querré tener una un montón de líneas, así que aunque podría tener X1 y1 y X2 Y2 para una sola línea, tendré una matriz multidimensional que tiene dos puntos cada uno con dos valores y luego, cuando tenga dos líneas, tenemos cuatro puntos cada uno con dos valores, así que en la línea 20 voy a crear una matriz que la llamaremos puntos que tiene dos puntos cada uno con dos, oh, ya sabes qué tres valores, porque la idea general de esto es que estamos Haciendo esto en tres dimensiones ahora, la otra cosa que quiero hacer aquí es pensar en el espacio de la ventana como cero, cero estando en el centro, así que si quiero dibujar una línea horizontal desde una cuerda hasta tres cuartos Por cierto, mis puntos serían puntos 0 coma cero, que es X, consideremos que esta línea va desde 0 ceros en el centro y esta línea va a ir de menos uno a uno, la escalaremos más tarde cero coma uno cuál sería la Y sería igual a cero porque estará en el centro.
Me pregunto si eventualmente esto será un cubo, aunque hagamos que sea una línea en la parte superior, así que será negativo uno y luego puntos 0. coma dos, que sería la Z, solo vamos a hacer que la Z sea cero, así que ese es el primer punto, el segundo punto será el mismo, pero el valor de x será positivo y externo, lo comenzaremos en la línea 500, que dibuja lo que esté en la matriz de puntos no no no no no no no tengamos una subrutina que dibuje una línea entre dos valores arbitrarios en la matriz de puntos en otras palabras H traza y olvídate de la Z por un segundo puntos una coma cero puntos una coma uno dos y a aún no existe. Voy a agregar eso, así que esto es X e Y del punto a a X e Y del punto B. Luego mire esto en la línea 50.
Puedo decir que a es igual a cero b es igual a uno. sub 500. Así que esto es esencialmente una forma de tener argumentos para una subrutina. Voy a configurar dos variables A y B justo antes de ir a la subrutina que dibuja una línea entre a y b y luego la línea 60. Soy I' Voy a ir a 50. Solo hazlo de nuevo, no vamos a hacer el intercambio todavía, solo quiero ver si esto funciona. Oh no, no, no, no, no, no, no, pero necesito hacer el escalado, oh, está bien, entonces necesito hacerlo. esto de una manera diferente, es bueno haber escrito todo eso, pero esencialmente lo que quiero hacer en la línea 500 es decir que X1 es un cero y luego lo multiplicaré por algún valor de escala, usemos SZ más la mitad del ancho, que es ¿Cuál era el ancho nuevamente? 280, así que más 140.
Probablemente debería poner eso en una variable en el Centro X. Vamos a tener que sea una variable, por lo que multiplicado por el tamaño, 1 negativo se convierte en el tamaño que sea, como 1 negativo es 50. Entonces, 50 negativo más. cualquiera que sea el desplazamiento central, eso estaría aquí, está bien, ese es X1 el centro y [Música], entonces solo puedo decir h trama X1 y1 a oh no X2 Y2, está bien, todos listos para editar [Música], luego 550 es un retorno. Creo que esto es bueno, oh, pero necesito estas variables ahora, vamos al principio, línea 12, usemos 50 píxeles para el tamaño. El centro X es 140 y el centro Y es la mitad de 192. Oh, tengo una línea allí. Debo he estropeado algo oh no, muchacho, esto ha sido un error durante mucho tiempo, está bien, listos todos, esto será el índice uno. Inicialicé el elemento cero de esta matriz dos veces. Lo volveré a escribir. Está bien, se ve bien, ejecutemos esto allí. te felicitamos, has visto 45 minutos de alguien en YouTube dibujando una línea, así que estamos en muy buena forma aquí, la mayor parte del trabajo consistirá en escribir muchas más coordenadas y luego escribir un bucle para recorrer y dibuje todas las líneas que conectan todas las coordenadas, pero antes de hacerlo hay un paso aquí, que es si quiero ver este cubo que voy a dibujar o cualquier forma que tenga o rotar y no hay diferencias en el procesador P5.
Traducir y rotar y empujar y hacer estallar, así que tendré que hacer eso con las matemáticas detrás de la rotación en sí. Esto es algo que cubrí extensamente en otro video donde hice renderizado 3D en un renderizador 2D escribiendo todo Matrix. matemáticas No voy a repetir todo eso en este video, pero sí quiero mostrarles las matemáticas básicas detrás de la rotación extranjera.
Digamos que tenemos un plano cartesiano y tenemos algún punto X coma Y en ese espacio cartesiano, podemos pensar en eso. apunte con respecto al origen y gire alrededor del origen en algún ángulo llamado Theta y terminaría aquí. Esta sería la nueva posición X e Y. He demostrado cómo hacer esto en videos anteriores analizando el concepto de coordenadas polares en última instancia. la forma de aplicar este tipo de transformación de rotación 2D es con Matrix math alien esta rotación Matrix gira el punto x y en sentido contrario a las agujas del reloj de acuerdo con el ángulo Theta, el punto X Y se escribe como un vector de columna y el nuevo punto es el resultado de ese vector multiplicado por Matriz de rotación vamos a obtener un nuevo vector de una sola columna y el primer elemento, la nueva X, es x veces el coseno de theta más y veces menos el seno Theta, entonces la nueva posición y es x veces el seno de theta más x veces el coseno de theta. cómo si X e Y fueran el punto 0 0 el nuevo punto sería cero cero porque al rotar 0 0 alrededor de 0 0 el punto permanece igual esto no aplica ningún tipo de traslación solo una rotación en sentido antihorario por el ángulo Theta en el contexto de la computadora En los gráficos, podríamos ir en el sentido de las agujas del reloj porque el eje y está volteado en tres dimensiones, no tenemos solo un solo plano y un solo ángulo, si aplicamos una rotación, necesitamos saber alrededor de qué eje X, Y o Z, curiosamente, este es en realidad el Matriz de rotación solo para el eje z, necesitamos extenderla para tener en cuenta Z, por lo que para obtener la nueva X diríamos x multiplicado por el coseno de theta más y multiplicado por el seno negativo de theta más Z multiplicado por cero el nuevo y x multiplicado por el seno más y multiplicado por el coseno más Z multiplicado por cero y luego el nuevo Z es x multiplicado por 0 más y multiplicado por cero más Z multiplicado por uno, por lo que Z no gira alrededor del eje Z, podemos observar la matriz de rotación para el eje y, así como la matriz de rotación.
para el eje x ahora que hemos cubierto cuáles son las matemáticas, las cosas que necesito agregar a este programa son una variable para el ángulo que voy a rotar, comenzaremos simplemente rotando a lo largo del eje z así como un segundo conjunto completo de puntos porque necesito otra variable para aplicar esa transformación, así que justo en la línea 25 vamos a rotar los puntos Z RZT y vamos a tener dos de ellos y ahí tienen x y y z.
Oh, Dios mío. Olvidé un paso importante: una vez que he girado el punto en tres dimensiones, necesito proyectarlo en dos dimensiones para dibujar las X e Y correctas, pero adivina qué voy a usar la forma sencilla de hacerlo. quitando la Z para que no sea perspectiva, será ortográfico, pero será lo suficientemente bueno para nosotros ahora mismo. Ahora tengo una matriz completamente separada para los puntos rotados. La línea 50 es donde estoy dibujando, así que en la línea 55. Hagamos otra subrutina dos mil y ahí es donde aplicaré las matemáticas de rotación que acabamos de realizar, así que 4 n es igual a 0 2 y solo tengo dos puntos en este momento.
Hay dos puntos en la matriz. Oh, me olvidé de un ángulo que se quedó sin líneas. de código aquí al principio, pero hagamos una línea 18 un ángulo, ¿me atrevo? No, no puedo usar a porque lo uso aquí, podría usar ángulo, la palabra ángulo, ángulo es igual a cero, luego la línea 2000 a 2010, el punto de rotación para Z de Si el valor de x es igual, entonces [Música] Necesito usar el coseno de theta, pero tan pronto como lo haga, pongo en coma 1 el valor de Y. Voy a querer usar el coseno de theta nuevamente y no quiero calcular. eso dos veces, así que en realidad lo que debería hacer incluso antes de hacer el bucle en la línea 2000 es decir CS para el coseno de theta es coseno de y no es Theta. Lo llamé ángulo, lo siento, y SN para el seno es el seno de ese ángulo, ahora podría hacer eso. Bucle para n es igual a 0 a 1 y luego r z p a la derecha del punto de rotación Z x o n para el punto final x es igual al coseno negativo.
Puede notar que mi Matrix original tenía un coseno positivo Theta y, sin embargo, acabo de escribir un coseno negativo Theta. También voy a escribir seno positivo en lugar de signo negativo, esto se debe a que en el mundo de los gráficos del Apple II más y apunta hacia abajo, los píxeles son positivos en la dirección hacia abajo y quiero que coincida con y apuntando hacia arriba, así que simplemente intercambié el signo allí y la rotación. sucede en la dirección correcta, ¿quién puede decir qué es correcto de todos modos, siempre y cuando sea consistente, pero solo quiero que sepan que es por eso que cambió por x, que es el punto cero más el seno por Y, que es uno más Z por cero ahora desde Estoy multiplicando por cero, no es necesario tener esa operación allí, probablemente debería omitirla, pero siento que para que las matemáticas sean consistentes, debería decir cero por puntos n coma dos, luego hagamos Y y es igual seno de theta multiplicado por X más coseno multiplicado por y más cero multiplicado por puntos multiplicado por Z y entonces sabes que para ser coherente debería hacer la Z, que es simplemente cero multiplicado por x otra vez, esto es un montón de cosas extra cero multiplicado por y más uno multiplicado por Z siguiente n Para pasar al siguiente punto, ahora la pregunta es en qué parte del código quiero aplicar esta rotación, así que aquí, comenzando en la línea 50, ese es esencialmente mi bucle de dibujo, dibuja la línea, gira el punto, luego regresa y hazlo de nuevo, dibuja la línea.
rotar, dibujar la línea, rotar, pero me falta cambiar los buffers y hay otro problema en el que estoy pensando, así que limpiemos nuestro código un poco, refactoricemos un poco y comencemos a poner un bucle de dibujo adecuado en la línea 100. I' Incluso voy a usar algunos comentarios aquí dibujar Bucle lo primero en dibujar Bucle debe ser rotar la línea y luego dibujar la línea Probablemente debería poner comentarios sobre todos estos, pero no tengo mucho tiempo en este momento y luego cambiar el buffers cuál es la subrutina en mil así es como se vería un comentario, pongámoslo para el fantasma Subs oh ups ah rota los puntos dibuja la línea cambia el buffer y comenzamos de nuevo, veamos qué pasa si ejecutamos esto genial Tengo la línea, no está girando, porque no aumenté el ángulo, así que en la línea 140 el ángulo es igual al ángulo más 0,1 y luego la línea 150 va a 100.
Ajá, todavía no funciona. Sé por qué. ¿ Sabes por qué? Piénsalo. vaya a esa subrutina en la línea 500. aquí es donde tomo el punto a y el punto B y los conecto trazando una línea, pero estoy buscando la ubicación del índice A y B en la matriz de puntos y los valores rotados están en el rzp matriz rotada por puntos Z rzp si tan solo hubiera alguna forma genérica de pasar un argumento. No creo que esto vaya a funcionar. Sé que no va a funcionar porque intenté hacerlo durante media hora, así que Simplemente voy a codificar en la matriz Z rotada y veremos más adelante si tengo que hacer múltiples tiempos de rotación.
Voy a manejar eso y adivinen qué es ahora el momento para una edición hermosa y elegante. Escapar por completo. y luego r z p y luego, por supuesto, tengo que pasar la flecha a la línea del episodio y hacer otra cosa por un rato, será un poco [Música] se ve bien, entonces hay un pequeño y agradable punto de repente. eso pasó aquí esto no funciona, oh Dios mío, cometí un error ridículo, mira esto, dejé mi antiguo bucle de dibujo allí, el que no aplica la rotación ni hace nada, así que tengo que deshacerme de ese 50 55 60 Ahora solo rezo aquí oh oh wow oh, creo que el primer intercambio no funciona, pero no, no me importa porque es totalmente increíble, gracias, ya terminé, me voy de aquí, es el final de esto.
video, averígualo tú mismo por qué el intercambio de búfer no funcionó mira algunas de mis investigaciones de referencia aquí oh Dios mío y se estaba ejecutando tan rápido sabes por qué olvidé borrar el paso de fondo en caso de que borrar el fondo sea parte de el intercambio del búfer, no lo creo porque, en última instancia, es realmente parte del bucle de sorteo, sí, me gusta intercambiar el búfer al final, así que 150 cambia el búfer, 160 va a 100 y luego lo que me falta allí en 105 no es Al cambiar el búfer se llama borrar el fondo, que se llama 62450 y creo que esto lo arreglará pero también hará que funcione increíblemente lento, eso no es tan malo, en realidad, para ser completamente honesto, está mi línea rotando en 3D, un cuadrado completo que está girando.
ahora mis puntos y mis puntos Z rotados necesitan tener cuatro puntos en ellos cuatro comas tres cuatro xyz es curioso, no estoy haciendo nada en 3D, pero lo haré, entonces hagámoslo, cambiémoslo ahora, cambiémoslo a una rotación por X así que hagamos todo eso en una línea, queremos verlo rotar, hagamos y, hagámoslo ahora, cuando estemos inicializando los puntos, lo que probablemente debería ser una subrutina porque me voy a quedar sin espacio, pero eso es bien, sí, debería ser una subrutina tonta, hagámosla en cinco mil y haré todos los puntos menos uno menos uno cero. Realmente debería usar un valor z ya que tengo que arreglarlo de todos modos porque si Eventualmente voy a hacer un cubo, tiene que haber cuatro puntos al frente y cuatro puntos atrás, como el centro del cubo. Es el centro de nuestro mundo 3D, así que dibujemos un cubo al frente para comenzar, dibujemos uno en el De regreso al comienzo, está bien, entonces me falta. Llamo allí y luego esto debería ser negativo porque es importante que este D haga algo.
Ahora estoy haciendo el tercer punto, el de abajo a la derecha, uno uno uno uno negativo uno negativo extranjero. uno uno negativo uno ¡ vaya! Espero que esto funcione [Aplausos] así que en lugar de inicializar los puntos aquí y la línea 30 simplemente vamos a decir ir por debajo de 5000 y luego olvidé que necesito un retorno allí, así que incluso si ejecuto esto, ooh, iba a digo que debería funcionar solo con los primeros dos puntos de la línea de diligencia de sintaxis 25. oh, olvidé el dim. Me emocioné tanto que olvidé escribir Den dim r-yp 4 coma tres, así que exactamente lo que teníamos antes, pero ahora, ¿ dónde está ese? ¿Dónde está mi sorteo? Bucle, oh, así que primero rotarlos todos, 2020 debe ser de cero a tres porque hay cuatro puntos y luego 120.
Así que ahora necesitaré muchas más cosas allí, así que también debería ser un sub 14. Quiero decir, eso es un poco loco. pero está bien, tengo algo a seis mil, no está bien, entonces seis mil dibuja líneas oh REM, dibuja líneas [Aplausos] así que primero conecta cero y uno extraño, luego conecta dos y tres, luego conecta tres y cero para poder hacer esto en un bucle, pero Solo quiero codificarlo para saber que es correcto. También anticipo tener muchos más puntos con una forma más elaborada y, en este punto, prefiero simplemente escribirlo todo y luego regresar 6050, así que ese es mi subrutina aquí para conectar todas esas líneas y volvamos a mi bucle de dibujo y en lugar de que la línea 120 sea esta, vamos a decir ir a líneas sub 6000 REM, está bien, ejecutaría esto oye, oye, oye, adivina lo que tenemos que hacer. esto hace el 3D, así que necesito agregar rotar X. Recuerdas los cálculos de Matrix que hicimos ahora, solo necesitamos agregar eso, ¿dónde sucede eso? ¿Dónde estaba esa subrutina 2000? Justo después de la línea 2050, ahí es donde apliqué las rotaciones de Matrix.
una rotación z Solo necesito hacer la multiplicación de matrices para una rotación X una rotación y me refiero a una rotación y así que eliminemos 2060 y 2070 ahora mismo y 2060 sería ryp n coma 0 es igual a coseno 0 seno cero uno cero seno negativo cero coseno, creo así es [Música] entonces 20 90 sería el siguiente y es cierto, primero deberíamos aplicar la rotación Y. Supongo que son seis de media docena a la otra porque ahora tendré que ajustar el uh cuando esté dibujando la línea oh. Vaya, el siguiente es 2090 y se devuelve 2100. Ejecutemos esto, en caso de que no veamos la rotación Y todavía porque todavía estoy dibujando los puntos rzp y se puede ver que en realidad se está ejecutando.
Pensé que sí. Estoy bastante impresionado. la velocidad de esto uh um pero ¿dónde está eso? Está aquí la subrutina de la línea 500. Ahora necesito cambiar esto otra vez. Habla entre ustedes [Música] extraño momento de la verdad No puedo imaginar que no haya cometido un error, pero eso está sucediendo antes simplemente ejecútelo y veamos quién adónde va adiós adónde vas Quiero decir, veo una especie de rotación 3D allí creo que es porque está fuera del centro lo que está haciendo es imaginar que es este trozo de papel lo que estoy Lo que hago es rotarlo así además de hacer esto, así que realmente está haciendo esto, lo cual creo que es lo que estoy viendo, déjame mostrártelo acelerado [Música] muy lento, pero trabajar, todo lo que me queda por hacer ahora es realmente Después de escribir mucho, necesito agregar cuatro puntos más para tener todos los puntos de un cubo.
Necesito dibujar ocho líneas más para que veamos el cubo completo y luego, si me siento un poco picante, me gustaría agregar la x. rotación del eje veremos el paso uno aumentar el tamaño de mis matrices. Me doy cuenta de que hice algo un poco raro aquí. Es correcto porque tengo cuatro puntos y tres dimensiones, pero los valores del índice son cero uno dos tres y cero uno dos y Applesoft Basic. espera que ponga no la longitud de la matriz sino el índice máximo, lo cual es extraño, pero así es como quiere que sea, corrijámoslo a medida que lo expando.
Oh, eso se ve mal, pero siete coma dos es una matriz bidimensional de ocho por tres. agregue una rotación X, mis matrices son más grandes ahora, ¿dónde las inicializo? Creo que en la subrutina a cinco mil Sí, aquí es donde inicializo 0 1 2 3. Sigamos. Tengo lo que podría ser una idea inteligente en lugar de escribir cuatro líneas más. de código Puedo editar estas líneas de código cambiando el número de línea, el índice de la matriz y la ubicación Z a la derecha.
Estos son los cuatro puntos en la parte posterior del cubo, menos uno, a los cuatro puntos en el frente del cubo, uno positivo, índice externo cuatro [ Música] quién sabe si esto es realmente mejor, pero va a funcionar. Creo que hay un soporte ahí del que tengo que deshacerme, veamos si funciona. Creo que lo tengo. Ahora tengo todos los puntos del cubo en mi matriz donde proceso esos puntos la subrutina en 2000 es donde los giro por una vez. De hecho, he hecho algo de una manera que hace que esto sea realmente fácil de editar. Lo único que necesito cambiar aquí es que el bucle ahora va en lugar de desde de cero a tres a de cero a siete ahora que estoy almacenando todos los puntos procesando todos los puntos, necesito dibujar todas las líneas para conectar el cubo completo, lo que sucede en la línea de subrutina 6000. Entonces necesito conectar la parte posterior del cubo [Música] y luego necesito conectar las esquinas de la parte posterior con las esquinas del frente [Música] ahí vamos.
Un gran ejercicio para cualquiera de ustedes que esté mirando es cuál es un algoritmo que podrían diseñar para hacer esto en algún tipo de bucle agradable. y me olvidé del retorno, que es muy importante uh oh, cometí un error con ciertas líneas que conecté, veamos eso wow, esto es genial, aunque hice una forma extraña, debo haber estropeado mis definiciones de puntos, ah He encontrado al culpable. Tengo un índice aquí en esta línea 50 60. Es el índice seis y dejé los dos allí extraños [Aplausos] gire ahora mire ese hermoso cubo ortogonal tridimensional. Siento que el eje x es sintiéndome excluido agreguemos rotación alrededor de ese eje.
No voy a sumar todo eso multiplicado por cero esta vez, hagámoslo de la manera simplificada, luego necesito la siguiente n y regresar, bien, los tres ejes [Música] hay algunas maneras en que Podría hacer que esto se ejecute más rápido. Seguro que podría estudiar la programación con lenguaje ensamblador, pero ¿hay algunas cosas que podría hacer en el código para optimizarlo? No usar la llamada para borrar el fondo de los gráficos y en su lugar borrar las líneas individuales sería más rápido. sobre precalcular todos los valores de seno y coseno que pueda necesitar y almacenarlos en una gran matriz, una tabla de búsqueda. Básicamente, esto también tendría la ventaja de permitirme tal vez usar diferentes ángulos para cada uno de los ejes para obtener una imagen más compleja.
rotación Me encantaría saber de usted cómo optimizaría este código. Incluiré un enlace a un emulador y este código que podría ejecutar allí y probar diferentes ideas y si tiene algo, hágamelo saber en los comentarios. Definitivamente abordarlo en un futuro video o transmisión en vivo. Otro desafío que me encantaría ofrecerles es agregar una proyección en perspectiva. Esto es un poco plano porque es una proyección ortográfica y las matemáticas para hacerlo, todo se describe en mi video de procesamiento de renderizado 3D y Incluiré información sobre cómo hacerlo en la descripción del video. Vea si puede hacer que funcione. También le mostraré cómo se ve aquí. Espero que hayan disfrutado otro episodio de codificación juntos. ¿Qué debo hacer en el próximo? Estoy pensando, ¿qué pasa con la música? ¿ Podría tocar una melodía deliciosa aquí con mi computadora Apple 2 plus? Estad atentos y nos vemos la próxima vez codificando juntos.
Ah, y no nos olvidemos de guardar nuestro disco de códigos lleno. Oh no, no, tengo 32. gigabytes en esta tarjeta SD de qué estás hablando, no te preocupes. Lo resolveré la próxima vez que veas este video y el código estará vinculado en la descripción hasta la próxima vez extranjero [Música].