Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Exercícios 3D

Reveja a matéria de Álgebra Linear e de Geometria Analítica.

Geometria 3D

Exercício 1

Vetor Perpendicular 1

  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?
  2. 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$.

  1. 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$??
  2. 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

  1. Implemente a função sum(u, v) que calcula a soma de dois vetores u e v: $$ \mathrm{sum}(u, v) = u + v = (u_x + v_x, u_y + v_y, u_z + v_z) $$
  2. Implemente a função scalar(a, u) que calcula o produto do escalar a pelo vetor u e use-a para definir minus(u) que calcula o simétrico do vetor u: $$ \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} $$
  3. Implemente a função inner(u, v) que calcula o produto interno de dois vetores u e v: $$ \mathrm{inner}(u, v) = u\cdot v = u_x \times v_x + u_y \times v_y + u_z \times v_z $$
  4. Implemente a função norm(u) que calcula a norma do vetor u: $$ \mathrm{norm}(u) = \left| u \right| = \sqrt{u \cdot u } = \mathrm{sqrt}(\mathrm{inner}(u, u)) $$
  5. Implemente a função dist(p, q) que calcula a distância entre dois pontos p e q: $$ \mathrm{dist}(p, q) = \left| p - q \right| = \mathrm{norm}( \mathrm{sum}(p, \mathrm{minus}(q)) ) $$
  6. Implemente a função vers(u) que calcula o versor do vetor u; 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) $$
  7. 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ção angle(u, v)que calcula o ângulo entre dois vetores u e v: $$ \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) $$
  8. Implemente a função are_colin(u, v) que devolve o booleano true se u e v forem co-lineares e false caso 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} $$

  1. Implemente a função outer(u, v) que calcula o produto externo entre dois vetores dados.
  2. Implemente a função perp(u, v) que calcula um vetor perpendicular a dois vetores dados.
  3. Implemente a função basis(u, v) que calcula uma base a partir de u e v:
    1. A função levanta uma exceção se u e v forem co-lineares.
    2. Caso contrário devolve uma lista de três vetores [a, b, c] em que
      • a é o versor de u,
      • b é o versor de v,
      • c é um vetor de norma $1$ perpendicular a u e a v.

Exercício 5

Conjuntos de Pontos

  1. Centro. Implemente a função center(points) que calcula o centro de um array de pontos.
  2. Próximo. Implemente a função nearest(target, points) em que target é um ponto 3D e points é um array de pontos 3D e que encontra o elemento de points que está mais próximo de target.
    • A sua função deve devolver um objeto com atributos {d, p} em que d é a distância e p o ponto mais próximo.
  3. Afastado. Implemente a função farthest(target, points) em que target é um ponto 3D e points é um array de pontos 3D e que encontra o elemento de points que está mais afastado de target. Resolva de forma semelhante à alínea anterior.
  4. «Mais Isolado». Implemente a função loneliest(points) em que points é um array de 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.
  5. «Mais Central». Implemente a função centralest(points) em que points é um array de 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.
  6. Canto Superior Direito Anterior. Implemente a função corner_trf(points) (trf: top right front) em que points é um array de 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);
    
  7. 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.
  8. Pontos Mais Afastados. Implemente a função most_apart(points) em que points é um array de pontos 3D e que encontra os dois elementos de points que estão mais afastados um do outro. Isto é, se $p, q$ forem esses pontos então, dados quaisquer dois pontos $a$ e $b$ em points então dist(a,b) <= dist(p,q).
  9. Pontos Menos Afastados. Implemente a função least_apart(points) em que points é um array de pontos 3D e que encontra os dois elementos distintos de points que estão menos afastados um do outro. Isto é, se $p, q$ forem esses pontos então, dados quaisquer dois pontos $a$ e $b$ em points então dist(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 array de pontos 2D {x, z} (note que é usado z e não y).
  • A espinha é definida por um array de 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 índice i = 1) e do vetor {x: 1.0, y: 2.0, z: -1.0} (com índice j = 2).
  • Assegure-se que i e j são índices válidos. Se não, a função deve devolver null.

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:

  1. Pontos e vetores são representados por objetos {x, y, z} de forma que o valor de cada atributo indica a respetiva cooredenada.
  2. A função direction(p, t) devolve um vetor d de forma que um raio emitido a partir da posição p apontado ao alvo t tem a direção d = direction(p, t).
  3. A função target(p, d) devolve uma posição t de forma que um raio emitido a partir da posição p na direção d atinge um alvo em t = target(p, d).

Modelação 3D

Resolva cada um destes exercícios usando as duas bibliotecas gráficas para 3D, X3D e 3JS.

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
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
Icosaedro

Um icosaedro é um dos cinco sólido platónicos (veja o artigo na wikipédia) 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>