Exercícios 3D
Reveja a matéria de Álgebra Linear e de Geometria Analítica.
Geometria 3D
Exercício 1
Vetor Perpendicular 1
- Dados dois vetores 3D $u = (u_x, u_y, u_z)$ e $v = (v_x, v_y, v_z)$, como é que encontra um terceiro vetor $w=(w_x, w_y, w_z)$ perpendicular a ambos?
- Como é que adapta a resolução da alínea anterior para o caso em que, em vez de dois vetores, são dados três pontos 3D, $A=(A_x, A_y, A_z), B=(B_x, B_y, B_z)$ e $C=(C_x, C_y, C_z)$?
Exercício 2
Posições, direções e alvos
No sistema 3JS a iluminação SpotLight é definida por uma posição $p = (p_x, p_y, p_z)$ e um alvo $t = (t_z, t_y, t_z)$, de forma que o foco de luz fica posicionado em $p$ e aponta para $t$.
Já no sistema X3D o mesmo tipo de iluminação é definido por uma posição $p$ análoga à de cima mas, em vez dum alvo, usa uma direção $d = (d_x, d_y, d_z)$, de forma que o foco de luz fica posicionado em $p$ a aponta na direção $d$.
- Como obtém $d$ em função de $p$ e $t$ de forma que um raio emitido a partir da posição $p$ apontado ao alvo $t$ tem a direção $d$??
- Como obtém $t$ em função de $p$ e $d$ de forma que um raio emitido a partir da posição $p$ na direção $d$ atinge um alvo em $t$.
Programação 3D
Representação de Coordenadas. Nestes exercícios pontos e vetores 3D são representados por objetos
{x, y, z}de forma que o valor de cada atributo indica a respetiva cooredenada. Pontos e vetores 2D ficam representados por objetos{x, y}(ou{u, v}no caso de texturas).
Exercício 3
Operações 3D
- Implemente a função
sum(u, v)que calcula a soma de dois vetoresuev: $$ \mathrm{sum}(u, v) = u + v = (u_x + v_x, u_y + v_y, u_z + v_z) $$ - Implemente a função
scalar(a, u)que calcula o produto do escalarapelo vetorue use-a para definirminus(u)que calcula o simétrico do vetoru: $$ \begin{aligned} \mathrm{scalar}(a, u) &= au &&= (a \times u_x, a \times u_y, a \times u_z) \cr \mathrm{minus}(u) &= -u &&= \mathrm{scalar}(-1, u) \end{aligned} $$ - Implemente a função
inner(u, v)que calcula o produto interno de dois vetoresuev: $$ \mathrm{inner}(u, v) = u\cdot v = u_x \times v_x + u_y \times v_y + u_z \times v_z $$ - Implemente a função
norm(u)que calcula a norma do vetoru: $$ \mathrm{norm}(u) = \left| u \right| = \sqrt{u \cdot u } = \mathrm{sqrt}(\mathrm{inner}(u, u)) $$ - Implemente a função
dist(p, q)que calcula a distância entre dois pontospeq: $$ \mathrm{dist}(p, q) = \left| p - q \right| = \mathrm{norm}( \mathrm{sum}(p, \mathrm{minus}(q)) ) $$ - Implemente a função
vers(u)que calcula o versor do vetoru; o versor de $u$ é um vector $v$ com norma $\left| v \right| = 1$ e com a mesma direção de $u$: $$ \mathrm{vers}(u) = \frac{1}{\left| u \right|} u = \mathrm{scalar}\left( \frac{1}{\mathrm{norm}(u)}, u\right) $$ - A fórmula
$$u\cdot v = \left|u\right|
\left|v\right|\cos\alpha$$ permite obter $\alpha$, o ângulo entre $u$ e $v$. Implemente a funçãoangle(u, v)que calcula o ângulo entre dois vetoresuev: $$ \mathrm{angle}(u, v) = \arccos\left( \frac{u \cdot v}{ \left| u \right| \left| v \right|} \right) = \arccos\left( \frac{\mathrm{inner}(u, v)}{ \mathrm{norm}(u)\mathrm{norm}(v)} \right) $$ - Implemente a função
are_colin(u, v)que devolve o booleanotrueseuevforem co-lineares efalsecaso contrário. Os vetores $u$ e $v$ são co-lineares de existe um escalar $\lambda \not= 0$ tal que $v = \lambda u$: $$ \mathrm{are_colin}(u, v) = \mathrm{angle}(u, v) == 0 $$
Exercício 4
Produto Externo
Supondo que $w = u \otimes v$ é o produto externo de $u$ e $v$, então as componentes de $w$ podem ser calculadas por $$ w_x \mathbf{x} + w_y \mathbf{y} + w_z \mathbf{z} = \begin{vmatrix} \mathbf{x} & \mathbf{y} & \mathbf{z} \cr u_x & u_y & u_z \cr v_x & v_y & v_z \end{vmatrix} $$
- Implemente a função
outer(u, v)que calcula o produto externo entre dois vetores dados. - Implemente a função
perp(u, v)que calcula um vetor perpendicular a dois vetores dados. - Implemente a função
basis(u, v)que calcula uma base a partir deuev:- A função levanta uma exceção se
uevforem co-lineares. - Caso contrário devolve uma lista de três vetores
[a, b, c]em queaé o versor deu,bé o versor dev,cé um vetor de norma $1$ perpendicular aue av.
- A função levanta uma exceção se
Exercício 5
Conjuntos de Pontos
- Centro. Implemente a função
center(points)que calcula o centro de umarrayde pontos. - Próximo. Implemente a função
nearest(target, points)em quetargeté um ponto 3D epointsé umarrayde pontos 3D e que encontra o elemento depointsque está mais próximo detarget.- A sua função deve devolver um objeto com atributos
{d, p}em quedé a distância epo ponto mais próximo.
- A sua função deve devolver um objeto com atributos
- Afastado. Implemente a função
farthest(target, points)em quetargeté um ponto 3D epointsé umarrayde pontos 3D e que encontra o elemento depointsque está mais afastado detarget. Resolva de forma semelhante à alínea anterior. - «Mais Isolado». Implemente a função
loneliest(points)em quepointsé umarrayde pontos 3D e que encontra o ponto «mais isolado» de um conjunto de pontos. O ponto «mais isolado» é o que está mais distante do centro. - «Mais Central». Implemente a função
centralest(points)em quepointsé umarrayde pontos 3D e que encontra o ponto «mais central» de um conjunto de pontos. O ponto «mais central» é o que está mais perto do centro. - Canto Superior Direito Anterior. Implemente a função
corner_trf(points)(trf: top right front) em quepointsé umarrayde pontos 3D e que encontra o «canto superior direito anterior» (SDA) de um conjunto de pontos. As coordenadas do SDA são os valores máximos nos eixos $x$, $y$ e $z$. Por exemplo:let points = [ {x: -1, y: 2, z: 0}, {x: 20, y: 1, z: 3} ]; {x: 20, y: 2, z: 3} === corner_tlf(points); - Canto Inferior Esquerdo Posterior. Implemente a função
corner_llb(points)(lrb: lower left back) nos mesmos moldes do exercício anterior, substituindo o máximo pelo mínimo. - Pontos Mais Afastados. Implemente a função
most_apart(points)em quepointsé umarrayde pontos 3D e que encontra os dois elementos depointsque estão mais afastados um do outro. Isto é, se $p, q$ forem esses pontos então, dados quaisquer dois pontos $a$ e $b$ empointsentãodist(a,b) <= dist(p,q). - Pontos Menos Afastados. Implemente a função
least_apart(points)em quepointsé umarrayde pontos 3D e que encontra os dois elementos distintos depointsque estão menos afastados um do outro. Isto é, se $p, q$ forem esses pontos então, dados quaisquer dois pontos $a$ e $b$ empointsentãodist(a,b) >= dist(p,q).
Exercício 6
Processamento de Extrusões
Na construção de uma extrusão a secção percorre a espinha. Suponha que:
- A secção é definida por um
arrayde pontos 2D{x, z}(note que é usadoze nãoy). - A espinha é definida por um
arrayde vetores 3D{x, y, z}.
Estes dois parâmetros definem os vértices da geometria obtida por extrusão.
Mais concretamente, cada ponto p:{x, z} da secção e cada vetor v:{x, y, z} da espinha definem o vértice
q = {x: p.x + v.x, y: v.y, z: p.z + v.z} da extrusão.
Por exemplo, dados
const section = [
{x: 0.0, z: 0.0},
{x: 1.0, z: 0.0},
{x: 0.0, z: 1.0} ];
const spine = [
{x: 0.0, y: 0.0, z: 0.0},
{x: 0.0, y: 1.0, z: 0.0},
{x: 1.0, y: 2.0, z: -1.0} ];
o ponto
section[2] === {x: 0.0, z: 1.0}
e o vetor
spine[1] === {x: 0.0, y: 1.0, z: 0.0}
definem o vértice
{x: 0.0, y: 1.0, z: 1.0}
Escreva a função vertex(i, j, section, spine) que devolve as coordenadas xyz do vértice definido pelo i-ésimo ponto da secção e pelo j-ésimo passo da espinha.
- Por exemplo, usando as variáveis acima,
vertex(1, 2, section, spine)é o ponto 3D{x: 2.0, y: 2.0, z: -1.0}, que resulta do ponto{x: 1.0, z: 0.0}(com índicei = 1) e do vetor{x: 1.0, y: 2.0, z: -1.0}(com índicej = 2). - Assegure-se que
iejsão índices válidos. Se não, a função deve devolvernull.
Exercício 7
Posições, direções e alvos (em
JavaScript)
No sistema 3JS a iluminação SpotLight é definida por uma posição $p = (p_x, p_y, p_z)$ e um alvo $t = (t_z, t_y, t_z)$, de forma que o foco de luz fica posicionado em $p$ e aponta para $t$.
Já no sistema X3D o mesmo tipo de iluminação é definido por uma posição $p$ análoga à de cima mas, em vez dum alvo, usa uma direção $d = (d_x, d_y, d_y)$, de forma que o foco de luz fica posicionado em $p$ a aponta na direção $d$.
Escreva funções JavaScript de acordo com as seguintes especificações:
- Pontos e vetores são representados por objetos
{x, y, z}de forma que o valor de cada atributo indica a respetiva cooredenada. - A função
direction(p, t)devolve um vetordde forma que um raio emitido a partir da posiçãopapontado ao alvottem a direçãod = direction(p, t). - A função
target(p, d)devolve uma posiçãotde forma que um raio emitido a partir da posiçãopna direçãodatinge um alvo emt = target(p, d).
Modelação 3D
Resolva cada um destes exercícios usando as duas bibliotecas gráficas para 3D,
X3De3JS.
Exercício 8
Modelar um referencial.
Modele um referencial XYZ. Assegure-se que os eixos estão corretamente orientados e use o seguinte esquema de cores: X:red; Y:green; Z:blue.
Exercício 9
Modelar uma pirâmide.
Modele uma pirâmide usando uma geometria por faces.
Exercício 10
Modelar um frustum.
Um frustum (veja também o artigo na wikipédia) é um poliedro (isto é, um sólido com todas as faces planas) com duas das faces quadradas paralelas (o topo e a base).
Modele um frustum, usando uma geometria por faces, com altura 1, em que a base é um quadrado de lado 2 e o topo um quadrado de lado 1.
Exercício 11
Modelar um octaedro.
| Octaedro |
Um octaedro é um dos cinco sólido platónicos (veja o artigo na wikipédia); tem oito faces triangulares e seis vértices:
$$ (0,1.5,0), (-1,0,1), (1,0,1), (1,0,-1), (-1,0,-1), (0,-1.5,0) $$
Modele um octaedro usando uma geometria por faces.
Exercício 12
Modelar um icosaedro.
| Icosaedro |
Um icosaedro é um dos cinco sólido platónicos (veja o ) e tem os vértices seguintes:
$$ \begin{aligned} && (0,\phi,1) && (0,\phi,-1) \cr && (-\phi,1,0) && (\phi,1,0) \cr (1,0,\phi) && (1,0,-\phi) && (-1,0,-\phi) && (-1,0,\phi) \cr && (-\phi,-1,0) && (\phi,-1,0) \cr && (0,-\phi,-1) && (0,-\phi,1) \end{aligned} $$ onde $\phi = \frac{\sqrt{5} + 1}{2} \approx 1.62$.
Modele um icosaedro usando uma geometria por faces.
Exercício 13
Pintar uma pirâmide.
Modele uma pirâmide com as texturas de difusão, brilho e normais obtidas de imagens feitas ou encontradas por si. Seja realista.
Exercício 14
Pintar uma tenda.
Os vértices de uma tenda estão dados abaixo
$$ \begin{aligned} &(0.0, 1.5, 0.0)\cr\cr (-.7, 1.0, 0.7) && (0.7, 1.0, 0.7)\cr (0.7, 1.0, -.7) && (-.7, 1.0, -.7)\cr\cr (-1., 0.0, 1.0) && (1.0, 0.0, 1.0)\cr (1.0, 0.0, -1.) && (-1., 0.0, -1.) \end{aligned} $$
Modele uma tenda pintada com texturas feitas (ou encontradas) por si. Seja realista.
Exercício 15
Iluminar uma pirâmide e uma tenda.
Use os modelos da pirâmide e da tenda que construiu com texturas de difusão, reflexos e normais e ilumine-a com:
- Uma fonte “direcional”.
- Uma fonte “ponto”.
- Uma fonte “foco”.
No caso do sistema X3D desligue a iluminação “geral” colocando o seguinte elemento no nó <Scene>:
<NavigationInfo headLight="false"></NavigationInfo>