Skip to the content.

Códigos, algoritmos, exemplos e aplicações

Esta página contém os códigos, algoritmos e exemplos das técnicas mostradas na disciplina de Visualização Científica.

A apostila está disponível no link: apostila de Visualização Científica

1. Introdução

Material da página 1 até a página 14.

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

2. Conceitos básicos e estruturais de visualização

Material da página 14 até a página 24.

📃 Código
Código em C++ com Matplotlib:
#include <vector> 
#include "matplotlibcpp.h" 
Namespaceplt plt=matplotlibcpp; 

intmain(){
std::vector<double>x={0, 1, 2, 3, 4, 5};
std::vector<double>y={1, 4, 9, 16, 32, 64};
plt::scatter(x,y,{}"color","red"{,{"marker":"o"}});
plt::show();

return0;
}

📃 Código
Código em Python com Matplotlib:
import matplotlib.pyplot as plt 

x = [0, 1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 32, 64]

plt.scatter(x, y, color = 'red', marker = 'o')
plt.show()

voltar ao topo

📃 Código
Gráfico de dispersão 3D:
import matplotlib.pyplot as plt 

x = [0, 1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 32, 64]
z = [2, 7, 11, 5, 3, 1]

ax = plt.figure().add_subplot(projection = '3d')

ax.scatter(x, y, z, color = 'r', marker = 'o')

plt.show()

voltar ao topo

voltar ao topo

voltar ao topo

📃 Código
Gráfico de dispersão 2D com rótulos:
import matplotlib.pyplot as plt 

x = [0, 1, 2, 3, 4, 5, 6]
y = [1, 4, 9, 16, 32, 64, 128]
rotulos = ['A', 'B', 'C', 'D', 'E', 'F', 'G']

for i, txt in enumerate(rotulos):
    plt.annotate(txt, (x[i], y[i]))
	
plt.plot(x, y, color = 'orange', marker = '^', linestyle = '-')

plt.show()

voltar ao topo

📃 Código
Gráfico de dispersão 3D com rótulos:
import matplotlib.pyplot as plt

ax = plt.figure().add_subplot(projection = '3d')

x = [0, 1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 32, 64]
z = [2, 7, 11, 5, 3, 1]
rotulos = ['A', 'B', 'C', 'D', 'E', 'F']

ax.scatter(x, y, z, color = 'r', marker = 'o')

for x, y, z, label in zip(x, y, z, rotulos):
    ax.text3D(x, y, z, label, zdir = 'z')
	
plt.show()
📃 Código
Gráfico de curvas 2D com legendas:
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 5, 0.1)

plt.plot(x, x, 'b--', label = 'y = x')
plt.plot(x, 2*x+1, 'g-', label = 'y = 2x + 1')
plt.plot(x, x**2+2*x+3, 'r-.', label = 'y = x^2 + 2x + 3')

plt.xlabel('x')
plt.ylabel('y')
plt.title('Gráfico de curvas 2D')

plt.show()
plt.legend()

voltar ao topo

📃 Código
Gráficos de curvas 2D:
import matplotlib.pyplot as plt
import numpy as np

def f(x):
    return np.exp(-x) * np.cos(2*np.pi*x)

x1 = np.arange(5, 12, 0.05)
x2 = np.arange(-2, 5, 0.05)

plt.figure()
plt.subplot(121)
plt.plot(x1, f(x1), 'b--', x2, f(x2), 'g-.')

plt.subplot(122)
plt.plot(x2, np.cos(2*np.pi*x2), color = 'orange', linestyle = ':')
plt.show()

voltar ao topo

📃 Código
Gráficos de curvas 3D:
import matplotlib.pyplot as plt
import numpy as np

ax = plt.figure().add_subplot(projection = '3d')

int = 10
x = np.linspace(-5, 5, int)
y = np.linspace(-5, 5, int)
z = np.linspace(-10, 10, int)

ax.plot(x, y, z**2+5, 'ro-')
ax.plot(x, y, 0, 'y--')

plt.show()

voltar ao topo

📃 Código
Gráfico da hélice cilíndrica:
import matplotlib.pyplot as plt
import numpy as np

ax = plt.figure().add_subplot(projection = '3d')

d = 5
z = np.linspace(-10, 10, 100)
x = d * np.sin(z)
y = d * np.cos(z)

ax.plot(x, y, z, 'g-', label = 'hélice cilíndrica')
ax.legend()

plt.show()

voltar ao topo

📃 Código
Gráfico da hélice cilíndrica com segmentos projetantes:
import matplotlib.pyplot as plt
import numpy as np

ax = plt.figure().add_subplot(projection = '3d')

d = 5
z = np.linspace(0, 2*np.pi, 25)
x = d * np.sin(z)
y = d * np.cos(z)

ax.stem(x, y, z)

plt.show()

voltar ao topo

3. Fundamentos dos dados

Material da página 24 até a página 54.

voltar ao topo

voltar ao topo

📃 Código
Conjunto de dados Iris com matplotlib (cor e movimento):
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

iris = pd.read_csv('C:/dados/iris.csv')

incl = np.array(iris.loc[:,'Largura da Sépala'])
x = np.array(iris.loc[:,'Comprimento da Sépala'])
y = np.array(iris.loc[:,'Comprimento da Pétala'])
z = np.array(iris.loc[:,'Espécie'])

i = np.arange(0, len(incl), 1)
j = (incl - min(incl))/(max(incl) - min(incl))
w = -45*j

label = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
cor = ['orange', 'green', 'red']
j = 0

for k in i:
    marker = (2, 1, w[k])
    if z[k] == z[k-1]:
        plt.plot(x[k], y[k], marker = marker, markersize = 10, color = cor[j - 1], alpha = 0.6)
    else:
        j +=1
        plt.plot(x[k], y[k], marker = marker, markersize = 10, color = cor[j - 1], alpha = 0.6, 
        label = label[j - 1] )

plt.legend(scatterpoints = 1)
plt.xlabel('Comprimento da Sépala')
plt.ylabel('Comprimento da Pétala')
plt.grid()
plt.show()

voltar ao topo

📃 Código
Conjunto de dados Iris com matplotlib (textura):
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

iris = pd.read_csv('C:/dados/iris.csv')

x = np.array(iris.loc[:,'Comprimento da Sépala'])
y = np.array(iris.loc[:,'Comprimento da Pétala'])
z = np.array(iris.loc[:,'Espécie'])

i = np.arange(0, len(x), 1)

label = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
tex = ['\\', '.', '+']
marker = ['^', 'X', 'o']
j = 0

for k in i:
    if z[k] == z[k-1]:
        plt.scatter(x[k], y[k], marker = marker[j - 1], s = 200, facecolor = 'white', 
        hatch = 5*tex[j-1], alpha = 0.5)
    else:
        j += 1
        plt.scatter(x[k], y[k], marker = marker[j - 1], s = 200, facecolor = 'white', 
        hatch = 5*tex[j-1], alpha = 0.5, label = label[j-1])

plt.xlabel('Comprimento da Sépala')
plt.ylabel('Comprimento da Pétala')
plt.legend(scatterpoints = 1)
plt.show()

voltar ao topo

📃 Código
Conjunto de dados Iris com Seaborn (cores):
import pandas as pd
import seaborn as sns

iris = pd.read_csv('C:/dados/iris.csv')

sns.relplot(data = iris, x = 'Comprimento da Sépala', y = 'Comprimento da Pétala',
    hue = 'Espécie', marker = '>', palette = 'Blues')
	

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

📃 Código
Conjunto de dados Iris com Seaborn (cores e tamanhos):
import pandas as pd
import seaborn as sns

iris = pd.read_csv('C:/dados/iris.csv')

sns.relplot(data = iris, x = 'Comprimento da Sépala', y = 'Comprimento da Pétala',
    hue = 'Espécie', marker = 's', palette = 'Reds', size = 'Largura da Sépala')
	

voltar ao topo

📃 Código
Conjunto de dados Iris com Seaborn (dispersão e frequência):
import pandas as pd
import seaborn as sns

iris = pd.read_csv('C:/dados/iris.csv')

sns.set_style("whitegrid")
sns.jointplot(data = iris, x = 'Comprimento da Sépala', y = 'Comprimento da Pétala',
    hue = 'Espécie', marker = 'o', palette = 'rainbow')
	

voltar ao topo

📃 Código
Conjunto de dados dos pinguins com Seaborn (regressão linear):
import pandas as pd
import seaborn as sns

pinguins = pd.read_csv('C:/dados/penguin2.csv')

sns.set_style("whitegrid")
sns.lmplot(data = pinguins, x = 'Comprimento do bico', y = 'Massa corporal',
    hue = 'Espécie', palette = 'rocket')

voltar ao topo

📃 Código
Conjunto de dados dos pinguins com Seaborn (combinações de gráficos):
import pandas as pd
import seaborn as sns

pinguins = pd.read_csv('C:/dados/penguin2.csv')

sns.set_style("whitegrid")
pinguins.drop(['Id','Ano'], inplace = True, axis = 1)
sns.pairplot(data = pinguins, hue = 'Espécie', palette = 'cubehelix')

📃 Código
Conjunto de dados dos pinguins com Seaborn (combinações de gráficos):
import pandas as pd
import seaborn as sns

pinguins = pd.read_csv('C:/dados/penguin2.csv')

sns.set_style("whitegrid")
pinguins.drop(['Id','Ano'], inplace = True, axis = 1)
g = sns.PairGrid(data = pinguins, hue = 'Espécie', palette = 'mako')
g.map_diag(sns.histplot)
g.map_offdiag(sns.kdeplot)
g.add_legend()

voltar ao topo

📃 Código
Conjunto de dados dos pinguins com Seaborn (combinações de gráficos):
import pandas as pd
import seaborn as sns

pinguins = pd.read_csv('C:/dados/penguin2.csv')

sns.set_style("whitegrid")
pinguins.drop(['Id','Ano'], inplace = True, axis = 1)
g = sns.PairGrid(data = pinguins, hue = 'Espécie', palette = 'mako')
g.map_diag(sns.histplot)
g.map_upper(sns.scatterplot, size = pinguins['Sexo'])
g.map_lower(sns.kdeplot)
g.add_legend(title = '', adjust_subtitles = True)
📃 Exemplo do uso da técnica PCA

Técnica PCA aplicada ao conjunto de dados Iris.

  • PCA aplicada ao conjunto Iris:
    import pandas as pd
    
    from sklearn import decomposition
    from sklearn import datasets
    
    import seaborn as sns
    
    iris = datasets.load_iris()
    X = pd.DataFrame (iris.data, 
    columns = ["sepal length (cm)","sepal width (cm)","petal length (cm)","petal width (cm)",])
    y = pd.DataFrame (iris.target, columns = ["target"])
    df = X.join (y)
    
    sns.pairplot (df, hue = "target",palette = "tab10");
    
    
  • Dados originais do conjunto Iris.
  • PCA aplicada ao conjunto Iris:
    X = iris.data
    y = iris.target
    
    pca = decomposition.PCA(n_components=2)
    pca.fit(X)
    X = pd.DataFrame (pca.transform(X), columns = ["Component 1", "Component 2"])
    y = pd.DataFrame (iris.target, columns = ["target"])
    df = X.join (y)
    
    sns.pairplot (df, hue = "target",palette = "tab10");
    
    
  • Dados com a combinação de 2 variáveis do conjunto Iris com o uso da técnica PCA.
📃 Código
Conjunto de dados Iris com Plotly (dispersão 3D):
import pandas as pd
import plotly.io as pio
import plotly.express as px

iris = pd.read_csv('C:/dados/iris.csv')

pio.renderers
pio.renderers.default = 'browser'

fig = px.scatter_3d(iris, x = 'Comprimento da Sépala', y = 'Comprimento da Pétala', 
    z = 'Largura da Sépala', color = 'Espécie')

fig.show()

voltar ao topo

voltar ao topo

voltar ao topo

📃 Código
Duas hélices (movimento):
import matplotlib.pyplot as plt
import numpy as np

ax = plt.figure().add_subplot(projection = '3d')

d = 1
e = 10
op = 0.9

z = np.arange(0, 200, 1)
x = d * np.sin(z/e)
y = d * np.cos(z/e)

for k in z:
    op *= 0.99
    ax.scatter(x[k], z[k], y[k], zdir = 'z', color = 'steelblue', alpha = op)
    ax.scatter(y[k] - d, d - z[k], x[k], zdir = 'z', color = 'lightcoral', alpha = op)

plt.show()

voltar ao topo

voltar ao topo

📃 Código
Dados vetoriais 2D:
import matplotlib.pyplot as plt

X = [1, 2, 3]
Y = [2, 1, 2]
U = [1, -1, 0.5]
V = [1, -1, -2]
cor = ['blue','red','orange']

fig, ax = plt.subplots()
Q = ax.quiver(X, Y, U, V, color = cor, units = 'xy', width = 0.02, scale = 1)

ax.plot(X, Y, 'og')
ax.set_aspect('equal', 'box')

plt.xlim([0, 4])
plt.ylim([-0.5, 3.5])
plt.grid()
plt.show()
📃 Código
Dados vetoriais 2D:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

dados = pd.read_csv('C:/dados/dados_teste.csv')

X = dados.loc[:,'x']
Y = dados.loc[:,'y']
U = dados.loc[:,'u']
V = dados.loc[:,'v']
fig, ax = plt.subplots()

M = np.hypot(U, V)
Q = ax.quiver(X, Y, U, V, M, units = 'x', width = 0.07, scale = 1.2)

ax.set_aspect('equal', 'box')

plt.grid()
plt.show()

📊 Arquivo CSV

voltar ao topo

📃 Código
Dados vetoriais 2D:
import matplotlib.pyplot as plt
import numpy as np

X, Y = np.meshgrid(np.arange(-5,5,0.5),np.arange(-5,5,0.5))

U = -Y/np.hypot(X, Y)
V = X/np.hypot(X, Y)

M = np.hypot(U**3, V**3)
fig, ax = plt.subplots()
Q = ax.quiver(X, Y, U, V, M, units = 'xy', width = 0.05, scale = 1.5)

ax.set_aspect('equal', 'box')

plt.show()
📃 Código
Dados vetoriais 3D:
import matplotlib.pyplot as plt

ax = plt.figure().add_subplot(projection = '3d')

x = [1, 2, 1]
y = [1, 2, 3]
z = [2, 1, 1]
u = [1, 2, 1]
v = [1, 1, -1]
w = [2, 3, -2]

Q = ax.quiver(x, y, z, u, v, w, length = 0.4, normalize = True, color = 'green', lw = 0.8)

ax.plot(x, y, z, 'ob')
plt.show()

voltar ao topo

📃 Código
Dados vetoriais 3D:
import matplotlib.pyplot as plt
import numpy as np

ax = plt.figure().add_subplot(projection = '3d')

x, y, z = np.meshgrid(np.arange(-2, 2, 0.5), np.arange(-2, 2, 0.5), np.arange(-2, 2, 0.5))
u = x - z
v = y + z
w = z + 1

cor = np.arcsinh(v, u)
cor = (cor.flatten() - cor.min()) / cor.ptp()
cor = plt.cm.hsv(cor)

a = ax.quiver(x, y, z, u, v, w, length = 0.4, normalize = True, colors = cor, lw = 0.8)

plt.show()

voltar ao topo

📃 Código
Dados vetoriais 3D:
import matplotlib.pyplot as plt
import numpy as np
from scipy.io import loadmat

ax = plt.figure().add_subplot(projection = '3d')
data_dict = loadmat('c:/dados/flow_field.mat')

x = np.transpose(data_dict['X'])
y = np.transpose(data_dict['Y'])
z = np.transpose(data_dict['Z'])
u = np.transpose(data_dict['V_x'])
v = np.transpose(data_dict['V_y'])
w = np.transpose(data_dict['V_z'])

ind = np.arange(0, len(x), 1500)

c = (np.arctan2(u, v))
c = (c.flatten() - c.min()) / c.ptp()
c = np.concatenate((c, np.repeat(c, 2)))
c = plt.cm.hsv(c)

ax.quiver(x[ind], y[ind], z[ind], u[ind], v[ind], w[ind], colors = c, length = 1.5, 
    normalize = True, lw = 0.7)

plt.show()

📊 Arquivo MAT

voltar ao topo

📃 Código
Dados vetoriais 3D:
import numpy as np
import matplotlib.pyplot as plt
import netCDF4 as nc

data = nc.Dataset('C:/dados/tornado3d.nc')
ax = plt.figure().add_subplot(projection = '3d')

u = np.array(data['u'])
v = np.array(data['v'])
w = np.array(data['w'])
xx = np.array(data['xdim'])
yy = np.array(data['ydim'])
zz = np.array(data['zdim'])

x, y, z = np.meshgrid(xx, yy, zz)

c = (np.arctan2(v, u))
c = (c.flatten() - c.min()) / c.ptp()
c = np.concatenate((c, np.repeat(c, 2)))
c = plt.cm.hsv(c)

a = ax.quiver(x, z, y, w, u, v, colors = c, length = 0.05, normalize = True, 
    lw = 2, alpha = 0.1)

plt.show()

📊 Arquivo NC

voltar ao topo

voltar ao topo

📃 Código
Linhas de fluxo 2D:
import plotly.figure_factory as ff
import numpy as np
import plotly.io as pio

pio.renderers
pio.renderers.default = 'browser'

x = np.linspace(-1, 1, 10)
y = np.linspace(-1, 1, 10)
Y, X = np.meshgrid(x, y)
u = 1 - X**2 + Y
v = -1 + X - Y**2
  
fig = ff.create_streamline(x, y, u, v, arrow_scale = 0.05)

fig.show()
📃 Código
Linhas de fluxo 3D:
import plotly.graph_objects as go
import pandas as pd
import plotly.io as pio

pio.renderers
pio.renderers.default = 'browser'

df = pd.read_csv('C:/dados/streamtube-wind.csv')

fig = go.Figure(data = go.Streamtube(x = df['x'], y = df['y'], z = df['z'], u = df['u'],
    v = df['v'], w = df['w'], sizeref = 0.3, colorscale = 'rainbow', maxdisplayed = 3000))

fig.update_layout(scene = dict(aspectratio = dict(x = 1.5, y = 1, z = 0.3)))

fig.show()

📊 Arquivo CSV

voltar ao topo

voltar ao topo

📃 Comandos básicos de dataframe

Exemplos de comandos da biblioteca pandas para dataframes.

  • Criando um dataframe:
    import pandas as pd
    import numpy as np
    
    x1 = [1,2,1,1,3,4]
    x2 = [7,8,np.nan,6,9,8]
    x3 = [6,6,4,3,9,7]
    classificacao = ['Tipo 1','Tipo 1','Tipo 2','Tipo 2','Tipo 3','Tipo 3']
    
    df = pd.DataFrame ([x1,x2,x3,classificacao], index = ['x1', 'x2', 'x3', 'Classificação']).T
    
    print(df)
    
    
    	x1	x2	x3	Classificação
    0	1	7	6	Tipo 1
    1	2	8	6	Tipo 1
    2	1	NaN	4	Tipo 2
    3	1	6	3	Tipo 2
    4	3	9	9	Tipo 3
    5	4	8	7	Tipo 3
    
  • Eliminando uma coluna:
    df = df.drop('x2', axis = 1)
    print(df)
    
    	x1	x3	Classificação
    0	1	6	Tipo 1
    1	2	6	Tipo 1
    2	1	4	Tipo 2
    3	1	3	Tipo 2
    4	3	9	Tipo 3
    5	4	7	Tipo 3
    
  • Selecionando somente os dados de Tipo 2:
    df = df[df['Classificação'] == 'Tipo 2']
    print(df)
    
    	x1	x2	x3	Classificação
    2	1	NaN	4	Tipo 2
    3	1	6	3	Tipo 2
    
  • Preenchendo os valores vazios:
    df.fillna(value=10, inplace = True)
    print(df)
    
    	x1	x2	x3	Classificação
    0	1	7	6	Tipo 1
    1	2	8	6	Tipo 1
    2	1	10	4	Tipo 2
    3	1	6	3	Tipo 2
    4	3	9	9	Tipo 3
    5	4	8	7	Tipo 3
    
  • Calculando a média dos dados de cada atributo pra cada classificação:
    print(df.groupby('Classificação').mean())
    
    Classificação	x1	x2	x3
    Tipo 1		1.5	7.5	6.0
    Tipo 2		1.0	8.0	3.5
    Tipo 3		3.5	8.5	8.0
    
  • Descrevendo os dados:
    print(df.describe())
    
    	x1	x2	x3	Classificação
    count	6	6	6	6
    unique	4	5	5	3
    top	1	8	6 	Tipo 1
    freq	3	2	2	2
    
  • Somando 1 a mais nas duas primeiras colunas:
    print(df.iloc[:, 0:2] + 1)
    
    	x1	x2
    0	2	8
    1	3	9
    2	2	11
    3	2	7
    4	4	10
    5	5	9
    

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

4. Taxonomia dos dados

Material da página 54 até a página 81.

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

📃 Código
Gráfico radar (polar):
import plotly.io as pio
pio.renderers
pio.renderers.default = 'browser'
import plotly.graph_objects as go

rotulos = ['Composition','Vocal','Rhythm', 'Solos', 'Humour']

fig = go.Figure()

fig.add_trace(go.Scatterpolar(r = [10, 8, 6, 5, 9], theta = rotulos, fill = 'toself', 
name = 'John', opacity = 0.3))
fig.add_trace(go.Scatterpolar(r = [10, 8, 6, 7, 6], theta = rotulos, fill = 'toself', 
name = 'Paul', opacity = 0.3))
fig.add_trace(go.Scatterpolar(r = [8, 7, 6, 10, 5], theta = rotulos, fill = 'toself', 
name = 'George', opacity = 0.3))
fig.add_trace(go.Scatterpolar(r = [2, 2, 10, 5, 5], theta = rotulos, fill = 'toself', 
name = 'Ringo', opacity = 0.3))

fig.show()

voltar ao topo

📃 Código
Gráfico com coordenadas paralelas:
import pandas as pd
import plotly.io as pio
import plotly.graph_objects as go
pio.renderers
pio.renderers.default = 'browser'

df = pd.read_csv('C:/dados/penguin2.csv')

fig = go.Figure(data = go.Parcoords(line = dict(color = df['Cor_id'],
    colorscale = [[0,'purple'],[0.5,'lightseagreen'],[1,'gold']]),
    dimensions = list([dict(label = 'Compr. do bico', values = df['Comprimento do bico']),
    dict(label = 'Profundidade do bico', values = df['Profundidade do bico']),
    dict(label = 'Compr. da nadadeira', values = df['Comprimento da nadadeira']),
    dict(label = 'Massa corporal', values = df['Massa corporal']),
    dict(label = 'Espécies', values = df['Cor_id'], tickvals = [1,2,3],
    ticktext = ['Adelie', 'Gentoo', 'Chinstrap'])])))
fig.update_layout(font = dict(size = 24))

fig.show()

voltar ao topo

📃 Código
Gráfico com seleção interativa:
from bokeh.layouts import gridplot
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource
from bokeh.transform import factor_cmap, factor_mark
import pandas as pd

df = pd.read_csv('C:/dados/penguin2.csv')
especies = ['Adelie', 'Gentoo', 'Chinstrap']
markers = ['hex', 'circle_x', 'triangle']

tools = 'box_select,lasso_select,box_zoom,pan'

source = ColumnDataSource(data = dict(x = df.loc[:,'Comprimento do bico'], 
	y = df.loc[:,'Profundidade do bico'], z = df.loc[:,'Comprimento da nadadeira'],
	w = df.loc[:,'Massa corporal'], esp = df.loc[:,'Espécie']))

p1 = figure(tools = tools, title = None)
p1.xaxis.axis_label = 'Comprimento do bico'
p1.yaxis.axis_label = 'Profundidade do bico'
p1.scatter(x = 'x', y = 'y', source = source, legend_field = 'esp', fill_alpha = 0.4, size = 12,
    marker = factor_mark('esp', markers, especies),
    color = factor_cmap('esp', 'Category10_3', especies))
p1.legend.location = 'bottom_right'

p2 = figure(tools = tools, title = None)
p2.xaxis.axis_label = 'Comprimento da nadadeira'
p2.yaxis.axis_label = 'Massa corporal'
p2.scatter(x = 'z', y = 'w', source = source, legend_field = 'esp', fill_alpha = 0.4, size = 12,
    marker = factor_mark('esp', markers, especies),
    color = factor_cmap('esp', 'Category10_3', especies))
p2.legend.location = 'bottom_right'

p = gridplot([[p1, p2]])
show(p)

voltar ao topo

voltar ao topo

📃 Código
Grafo orientado:
import networkx as nx
import matplotlib.pyplot as plt

arcos = [['Madrid','Paris'], ['Madrid','Bern'], ['Bern','Madrid'], ['Bern','Amsterdan'], 
    ['Bern','Berlin'], ['Bern','Rome'], ['Amsterdan','Berlin'], ['Amsterdan','Copenhagen'], 
    ['Berlin','Copenhagen'], ['Berlin','Budapest'],['Berlin','Warsaw'], ['Berlin','Rome'], 
    ['Budapest','Warsaw'], ['Budapest','Rome'], ['Budapest','Athens'], ['Budapest','Bucharest'], 
    ['Bucharest','Athens'], ['Bucharest','Ankara'], ['Bucharest','Kiev'], ['Ankara','Moscow'], 
    ['Kiev','Moscow'], ['Warsaw','Moscow'], ['Moscow','Kiev'], ['Warsaw','Kiev'], 
    ['Paris','Amsterdan'], ['Paris','Bern']]
g = nx.DiGraph()
g.add_edges_from(arcos)
plt.figure()

pos = {'Madrid': [36, 0], 'Paris': [114, 151], 'Bern': [184, 116], 'Berlin': [261, 228],
    'Amsterdan': [151, 222], 'Rome': [244, 21], 'Copenhagen': [247, 294], 'Budapest': [331, 121],
    'Warsaw': [356, 221], 'Athens': [390, -44], 'Bucharest': [422, 67], 'Ankara': [509, -13], 
    'Kiev': [480, 177], 'Moscow': [570, 300]}

cor = ['orange', 'orange', 'green', 'orange', 'magenta', 'orange', 'orange', 'red', 
    'orange', 'orange', 'orange', 'red', 'orange', 'orange']

rotulos = {('Madrid','Paris'):'12', ('Madrid','Bern'):'15', ('Bern','Amsterdan'):'9', 
    ('Bern','Berlin'):'10', ('Bern','Rome'):'10', ('Paris','Bern'):'6', ('Amsterdan','Berlin'):'7', 
    ('Paris','Amsterdan'):'6', ('Amsterdan','Copenhagen'):'9', ('Berlin','Copenhagen'):'7',
    ('Berlin','Budapest'):'9', ('Berlin','Warsaw'):'6', ('Berlin','Rome'):'15', 
    ('Budapest','Warsaw'):'9', ('Budapest','Rome'):'12',  ('Budapest','Bucharest'):'10',
    ('Budapest','Athens'):'15', ('Bucharest','Athens'):'14',  ('Bucharest','Ankara'):'13',
    ('Ankara','Moscow'):'39', ('Bucharest','Kiev'):'12', ('Warsaw','Kiev'):'10', 
    ('Warsaw','Moscow'):'14', ('Moscow','Kiev'):'10'}

nx.draw(g, pos, with_labels = True, node_color = cor, edge_color = 'grey', alpha = 0.5, 
    linewidths = 1, node_size = 1250, labels = {node: node for node in g.nodes()})
nx.draw_networkx_edge_labels(g, pos, edge_labels = rotulos, font_color = 'green')

plt.show()

voltar ao topo

📃 Código
Grafo orientado para circuito Hamiltoniano:
import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd

plt.figure()

df = pd.read_csv('C:/dados/alb1000.csv')
df_s = pd.read_csv('C:/dados/alb1000_opt.csv')

g = nx.from_pandas_edgelist(df, source = 'v1', target = 'v2')
pos = nx.kamada_kawai_layout(g)
nx.draw(g, pos = pos, node_color = 'grey', edge_color = 'grey', alpha = 0.1, linewidths = 0.2, 
    node_size = 40)

g1 = nx.from_pandas_edgelist(df_s, source = 'v1', target = 'v2', create_using = nx.DiGraph)
nx.draw(g1, pos = pos, node_color = 'green', edge_color = 'royalblue', alpha = 0.5,
    linewidths = 2, node_size = 40)

plt.show()

📊 Arquivo com os dados dos nós

📊 Arquivo com a solução ótima

voltar ao topo

📃 Código
Grafo orientado para o problema do Caixeiro Viajante:
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

plt.figure()

position = np.array(pd.read_csv('C:/dados/pcb442.csv'))
df = pd.read_csv('C:/dados/pcb442_opt.csv')

i = np.arange(0, len(df))
g = nx.from_pandas_edgelist(df, source = 'v1', target = 'v2', create_using = nx.DiGraph)
pos = {}

for k in i:
    pos[k] = [position[k][1], position[k][2]]

nx.draw(g, pos = pos, node_color = 'royalblue', edge_color = 'green', alpha = 0.6, 
    linewidths = 1, node_size = 40)

plt.show()

📊 Arquivo com os dados dos nós

📊 Arquivo com a solução ótima

voltar ao topo

voltar ao topo

📃 Código
Gráfico de setores:
import plotly.io as pio
import plotly.express as px
pio.renderers
pio.renderers.default = 'browser'

setores = ['Government', 'Real Estate', 'Technology, Media e Startups', 'Banking & Fiance', 
    'Economic Development', 'Health Care', 'Sports Business', 'Arts, Travel, Tourism & Ports',
    'Restaurants', 'Law', 'Transit', 'Education & Nonprofits', 'Retail & Entertainment']

valores = [19, 8, 8, 8, 14, 9, 7, 6, 5, 5, 3, 5, 3]

fig = px.pie(values = valores, names = setores, opacity = 0.9)

fig.show()

voltar ao topo

📃 Código
Gráfico Treeview:
import plotly.express as px
import pandas as pd
import plotly.io as pio
pio.renderers
pio.renderers.default = 'browser'

setores = ['Government', 'Real Estate', 'Technology, Media e Startups', 'Banking & Fiance', 
    'Economic Development', 'Health Care', 'Sports Business', 'Arts, Travel, Tourism & Ports',
    'Restaurants', 'Law', 'Transit', 'Education & Nonprofits', 'Retail & Entertainment']

valores = [19, 8, 8, 8, 14, 9, 7, 6, 5, 5, 3, 5, 3]

df = pd.DataFrame(dict(setores = setores, valores = valores))

df['Power 100 by Industry'] = 'Power 100 by Industry'

fig = px.treemap(df, path = ['Power 100 by Industry', 'setores'], values = 'valores', 
    color_continuous_scale = 'spectral', color = 'valores')

fig.update_traces(root_color = 'lightgrey', opacity = 0.9)
fig.update_layout(margin = dict(t = 25, l = 25, r = 25, b = 25))

fig.show()

voltar ao topo

📃 Código
Gráfico Treeview:
import plotly.express as px
import pandas as pd
import plotly.io as pio
pio.renderers
pio.renderers.default = 'browser'

setores = ['Government', 'Real Estate', 'Technology, Media e Startups', 'Banking & Fiance', 
    'Economic Development', 'Health Care', 'Sports Business', 'Arts, Travel, Tourism & Ports',
    'Restaurants', 'Law', 'Transit', 'Education & Nonprofits', 'Retail & Entertainment']

valores = [19, 8, 8, 8, 14, 9, 7, 6, 5, 5, 3, 5, 3]

categorias = ['State', 'State', 'Technology', 'State', 'Technology', 'State', 'Entertainment', 
    'Entertainment', 'Entertainment', 'State', 'State', 'State', 'Entertainment']

df = pd.DataFrame(dict(setores = setores, valores = valores, categorias = categorias))

df['Power 100 by Industry'] = 'Power 100 by Industry'

fig = px.treemap(df, path = ['Power 100 by Industry', 'categorias', 'setores'], 
	values = 'valores', color_continuous_scale = 'spectral', color = 'valores')

fig.update_traces(root_color = 'lightgrey', opacity = 0.9)
fig.update_layout(margin = dict(t = 25, l = 25, r = 25, b = 25))

fig.show()

voltar ao topo

📃 Código
Gráfico Treeview:
import plotly.express as px
import plotly.io as pio
import pandas as pd
import numpy as np
pio.renderers
pio.renderers.default = 'browser'

df = pd.read_csv('C:/dados/treemap1.csv')

fig = px.treemap(df, path = [px.Constant('IEEE Spectrum'), 'Country', 'Company'], 
    values = 'Sales 2005', color = 'Sales 2005', hover_data = ['Sales 2006'],
    color_continuous_scale = 'rainbow', 
    color_continuous_midpoint = np.average(df['Sales 2006'], weights = df['Rank 2006']))

fig.update_layout(margin = dict(t = 25, l = 25, r = 25, b = 25))

fig.show()

📊 Arquivo de dados para o Treemap

📃 Código
Gráfico Sunburst (aneis aninhados):
import plotly.express as px
import pandas as pd
import plotly.io as pio
pio.renderers
pio.renderers.default = 'browser'

setores = ['Government', 'Real Estate', 'Technology, Media e Startups', 'Banking & Fiance', 
    'Economic Development', 'Health Care', 'Sports Business', 'Arts, Travel, Tourism & Ports',
    'Restaurants', 'Law', 'Transit', 'Education & Nonprofits', 'Retail & Entertainment']

valores = [19, 8, 8, 8, 14, 9, 7, 6, 5, 5, 3, 5, 3]

categorias = ['State', 'State', 'Technology', 'State', 'Technology', 'State', 'Entertainment', 
    'Entertainment', 'Entertainment', 'State', 'State', 'State', 'Entertainment']

df = pd.DataFrame(dict(setores = setores, valores = valores, categorias = categorias))

df['Power 100 by Industry'] = 'Power 100 by Industry'

fig = px.sunburst(df, path = ['Power 100 by Industry', 'setores'], values = 'valores', 
    color_continuous_scale = 'spectral', color = 'valores')

fig.update_traces(root_color = 'lightgrey', opacity = 0.9)
fig.update_layout(margin = dict(t = 25, l = 25, r = 25, b = 25))

fig.show()
📃 Código
Gráfico Sunburst (aneis aninhados):
import plotly.express as px
import pandas as pd
import plotly.io as pio
pio.renderers
pio.renderers.default = 'browser'

setores = ['Government', 'Real Estate', 'Technology, Media e Startups', 'Banking & Fiance', 
    'Economic Development', 'Health Care', 'Sports Business', 'Arts, Travel, Tourism & Ports',
    'Restaurants', 'Law', 'Transit', 'Education & Nonprofits', 'Retail & Entertainment']

valores = [19, 8, 8, 8, 14, 9, 7, 6, 5, 5, 3, 5, 3]

categorias = ['State', 'State', 'Technology', 'State', 'Technology', 'State', 'Entertainment', 
    'Entertainment', 'Entertainment', 'State', 'State', 'State', 'Entertainment']

df = pd.DataFrame(dict(setores = setores, valores = valores, categorias = categorias))

df['Power 100 by Industry'] = 'Power 100 by Industry'

fig = px.sunburst(df, path = ['Power 100 by Industry', 'categorias', 'setores'], 
	values = 'valores', color_continuous_scale = 'spectral', color = 'valores')

fig.update_traces(root_color = 'lightgrey', opacity = 0.9)
fig.update_layout(margin = dict(t = 25, l = 25, r = 25, b = 25))

fig.show()
📃 Código
Gráfico Sunburst (aneis aninhados):
import plotly.express as px
import plotly.io as pio
import pandas as pd
import numpy as np
pio.renderers
pio.renderers.default = 'browser'

df = pd.read_csv('C:/dados/treemap1.csv')

fig = px.sunburst(df, path = [px.Constant('IEEE Spectrum'), 'Country', 'Company'], 
    values = 'Sales 2005', color = 'Sales 2005', hover_data = ['Sales 2006'],
    color_continuous_scale = 'rainbow', 
    color_continuous_midpoint = np.average(df['Sales 2006'], weights = df['Rank 2006']))

fig.update_layout(margin = dict(t = 25, l = 25, r = 25, b = 25))

fig.show()

voltar ao topo

voltar ao topo

voltar ao topo

📃 Código
Gráfico RadViz:
import pandas as pd
from matplotlib import pyplot as plt

pinguin = pd.read_csv('C:/dados/penguin2.csv', header = 0, usecols = [1,3,4,5,6,8])

ax = plt.grid(color = '#d5f8e3', linewidth = 0.5)
fig = pd.plotting.radviz(pinguin, 'Espécie', colormap = 'rainbow', alpha = 0.6, ax = ax)

fig.show
📃 Código
Gráfico de enxame (swarm):
import pandas as pd
import seaborn as sns

pinguin = pd.read_csv('C:/dados/penguin2.csv')
sns.swarmplot(x = 'Comprimento da nadadeira', y = 'Espécie', hue = 'Sexo', data = pinguin)

📃 Código
Gráfico de enxame (swarm) com diagrama em caixas (boxplot):
import pandas as pd
import seaborn as sns

pinguin = pd.read_csv('C:/dados/penguin2.csv')
sns.boxplot(x = 'Comprimento da nadadeira', y = 'Espécie', data = pinguin)
sns.swarmplot(x = 'Comprimento da nadadeira', y = 'Espécie', hue = 'Sexo', data = pinguin)

voltar ao topo

📃 Código
Gráfico de enxame (swarm) com violino:
import pandas as pd
import seaborn as sns

pinguin = pd.read_csv('C:/dados/penguin2.csv')
sns.violinplot(x = 'Comprimento da nadadeira', y = 'Espécie', data = pinguin, 
    palette = 'Oranges')
sns.swarmplot(x = 'Comprimento da nadadeira', y = 'Espécie', hue = 'Sexo', data = pinguin,  
    palette = 'Blues')

voltar ao topo

📃 Código
Reconhecimento de imagens:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

im = Image.open('C:/dados/imagem.png').convert('RGB')
          
imf = np.asarray(im)
imf.tofile('C:/dados/testeImagem.csv', sep = ',')

print(im.size)
plt.imshow(imf)
print(imf)

📊 Imagem de 16x16 pixels

voltar ao topo

voltar ao topo

5. Linhas, polígonos, poliedros e superfícies

Material da página 81 até a página 92.

📃 Código
Construção de um retângulo:
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches

verts = [(0, 0), (0, 1), (2, 1), (2, 0), (0, 0),]
path = Path(verts)

fig, ax = plt.subplots()
patch = patches.PathPatch(path, facecolor = 'aqua', linestyle = '--', linewidth = 2, 
    edgecolor = 'red')
ax.add_patch(patch)

ax.set_xlim(-1, 2.5)
ax.set_ylim(-1, 1.5)
plt.gca().set_aspect('equal', adjustable = 'box')

plt.show()
📃 Código
Construção de uma elipse:
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse

fig, ax = plt.subplots()
patch = Ellipse((0.5, 0.5), 0.7, 0.3, color = 'orange')
ax.add_patch(patch)

plt.show()

voltar ao topo

📃 Código
Construção da superfície lateral de um cilindro circular reto:
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

raio = 3
altura = 7
x = np.linspace(-raio, raio, 100)
z = np.linspace(0, altura, 100)
x1, z1 = np.meshgrid(x, z)
y1 = np.sqrt(raio**2-x1**2)

rstride = 10
cstride = 10
ax.plot_surface(x1, y1, z1, alpha = 0.7, color = 'green', rstride = rstride, cstride = cstride)
ax.plot_surface(x1, -y1, z1, alpha = 0.7, color = 'green', rstride = rstride, cstride= cstride)

plt.show()
📃 Código
Construção de um cilindro circular reto:
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

raio = 3
altura = 7
x = np.linspace(-raio, raio, 100)
z = np.linspace(0, altura, 100)
x1, z1 = np.meshgrid(x, z)
y1 = np.sqrt(raio**2-x1**2)

rstride = 10
cstride = 10
ax.plot_surface(x1, y1, z1, alpha = 0.7, color = 'green', rstride = rstride, cstride = cstride)
ax.plot_surface(x1, -y1, z1, alpha = 0.7, color = 'green', rstride = rstride, cstride= cstride)

from matplotlib.patches import Circle
import mpl_toolkits.mplot3d.art3d as art3d

p = Circle((0, 0), raio, color = 'red', alpha = 0.5)
ax.add_patch(p)
art3d.pathpatch_2d_to_3d(p, z = 0, zdir = 'z')
p = Circle((0, 0), raio, color = 'red', alpha = 0.5)
ax.add_patch(p)
art3d.pathpatch_2d_to_3d(p, z = altura, zdir = 'z')

plt.show()

voltar ao topo

📃 Código
Construção de um cone circular reto:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Circle
import mpl_toolkits.mplot3d.art3d as art3d

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

raio = 3
altura = 7
x = np.linspace(-raio, raio, 155)
z = np.linspace(0, altura, 155)
x1, z1 = np.meshgrid(x, z)
y1 = np.sqrt(z1**2*(raio/altura)**2 - x1**2)

rstride = 10
cstride = 10
ax.plot_surface(x1, y1, -z1, alpha = 0.7, color = 'grey', rstride = rstride, cstride = cstride)
ax.plot_surface(x1, -y1, -z1, alpha = 0.7, color = 'grey', rstride = rstride, cstride= cstride)

p = Circle((0, 0), raio, color = 'aqua', alpha = 0.5)
ax.add_patch(p)
art3d.pathpatch_2d_to_3d(p, z = -altura, zdir = 'z')

plt.show()
📃 Código
Construção de um cone circular reto (coordenadas polares):
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Circle
import mpl_toolkits.mplot3d.art3d as art3d

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

raio = 4
altura = 7
altura1 = np.linspace(0, altura, 150)
raio1 = np.linspace(0, raio, 150)
theta = np.linspace(0, 2*np.pi, 150)

R, T = np.meshgrid(raio1, theta)
A, T = np.meshgrid(altura1, theta)
X, Y, Z = R*np.cos(T), R*np.sin(T), A

p = Circle((0, 0), raio, color = 'aqua', alpha = 0.2)
ax.add_patch(p)
art3d.pathpatch_2d_to_3d(p, z = -altura, zdir = 'z')

rstride = 10
cstride = 10
ax.plot_surface(X, Y, -Z, alpha = 0.7, color = 'grey', rstride = rstride, cstride = cstride)

plt.show()

voltar ao topo

voltar ao topo

📃 Código
Construção de uma superfície:
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

r = 3
x = np.linspace(-r, r, 155)
y = np.linspace(-r, r, 155)
x1, y1 = np.meshgrid(x, y)
z1 = x1*np.exp(-x1**2 - y1**4)

ax.plot_surface(x1, y1, z1, alpha = 0.7, cmap = 'cool_r')

plt.show()

voltar ao topo

📃 Código
Construção de um poliedro:
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

v = np.array([[1, 1, 0], [5, 1, 0], [5, 5, 0], [1, 5, 0], [1, 1, 4], [5, 1, 4], [5, 5, 4], 
    [1, 5, 4]])

faces = [[v[0],v[1],v[2],v[3]], [v[0],v[1],v[5],v[4]], [v[0],v[3],v[7],v[4]],
    [v[3],v[2],v[6],v[7]], [v[1],v[2],v[6],v[5]], [v[4],v[5],v[6],v[7]]]

ax.scatter3D(v[:, 0], v[:, 1], v[:, 2])

ax.add_collection3d(Poly3DCollection(faces, facecolors = 'orange', edgecolors = 'blue', 
    alpha = 0.25))

plt.show()
📃 Código
Construção de um poliedro com rótulos dos vértices:
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

v = np.array([[1, 1, 0], [5, 1, 0], [5, 5, 0], [1, 5, 0], [1, 1, 4], [5, 1, 4], [5, 5, 4], 
[1, 5, 4]])

faces = [[v[0],v[1],v[2],v[3]], [v[0],v[1],v[5],v[4]], [v[0],v[3],v[7],v[4]],
         [v[3],v[2],v[6],v[7]], [v[1],v[2],v[6],v[5]], [v[4],v[5],v[6],v[7]]]

ax.scatter3D(v[:, 0], v[:, 1], v[:, 2])

cores = ['blue', 'green', 'yellow', 'red', 'cyan', 'black']

ax.add_collection3d(Poly3DCollection(faces, facecolors = cores, edgecolors = 'blue', 
    alpha = 0.25))

x = v[:, 0]
y = v[:, 1]
z = v[:, 2]
rotulos = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

for x, y, z, tag in zip(x, y, z, rotulos):
    label = tag
    ax.text3D(x, y, z, label, zdir = [1,1,1], color = 'k')

ax.set_box_aspect((np.ptp(v[:, 0]), np.ptp(v[:, 1]), np.ptp(v[:, 2])))

plt.show()

voltar ao topo

📃 Código
Construção de uma superfície com triangulação:
import matplotlib.pyplot as plt
import numpy as np

n_raio = 10
n_angulos = 48
raio = np.linspace(0.125, 1.0, n_raio)
angulo = np.linspace(0, 2*np.pi, n_angulos, endpoint = False)[..., np.newaxis]

x = np.append(0, (raio*np.cos(angulo)).flatten())
y = np.append(0, (raio*np.sin(angulo)).flatten())
z = np.sin(-x*y)

ax = plt.figure().add_subplot(projection = '3d')
ax.plot_trisurf(x, y, z, linewidth = 0.2, cmap = 'RdBu')

ax.set_box_aspect((np.ptp(x), np.ptp(y), np.ptp(z)))

plt.show()
📃 Código
Construção de uma superfície com coordenadas de um arquivo:
import numpy as np
import matplotlib.pyplot as plt

vertices = np.array(np.loadtxt('C:/dados/volcano.txt', int))
x = vertices[:,0]
y = vertices[:,1]
z = vertices[:,2]

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

ax.plot_trisurf(x, y, z, cmap = 'jet_r', edgecolor = 'grey', linewidth = 0.15, alpha = 0.7)

plt.show()

📊 Arquivo com as coordenadas da superfície

voltar ao topo

voltar ao topo

📃 Código
Triangulação de um objeto 3D de extensão PLY:
from plyfile import PlyData
import numpy as np
import matplotlib.pyplot as plt

plydata = PlyData.read('C:/dados/galleon.ply')
with open('C:/dados/galleon.ply', 'rb') as f:
    plydata = PlyData.read(f)

plydata.elements[0].name
plydata.elements[0].data[0]
nr_vertices = plydata.elements[0].count
nr_faces = plydata.elements[1].count

vertices = np.array([plydata['vertex'][k] for k in range(nr_vertices)])
x, y, z = zip(*vertices)

faces = [plydata['face'][k][0] for k in range(nr_faces)]
ax = plt.figure().add_subplot(projection = '3d')

ax.plot_trisurf(x, y, z, triangles = faces, cmap = 'RdBu_r', edgecolor = 'green', 
    linewidth = 0.1, alpha = 0.5)

ax.set_box_aspect((np.ptp(x), np.ptp(y), np.ptp(z)))

plt.show()

📊 Arquivo galleon PLY

📃 Código
Triangulação de um objeto 3D de extensão PLY:
from plyfile import PlyData
import numpy as np
import matplotlib.pyplot as plt

plydata = PlyData.read('C:/dados/chopper.ply')
with open('C:/dados/chopper.ply', 'rb') as f:
    plydata = PlyData.read(f)

plydata.elements[0].name
plydata.elements[0].data[0]
nr_vertices = plydata.elements[0].count
nr_faces = plydata.elements[1].count

vertices = np.array([plydata['vertex'][k] for k in range(nr_vertices)])
x, y, z = zip(*vertices)

faces = [plydata['face'][k][0] for k in range(nr_faces)]
ax = plt.figure().add_subplot(projection = '3d')

ax.plot_trisurf(x, y, z, triangles = faces, cmap = 'RdBu_r', edgecolor = 'green', 
linewidth = 0.1, alpha = 0.5)

ax.set_box_aspect((np.ptp(x), np.ptp(y), np.ptp(z)))

plt.axis('off')

plt.show()

📊 Arquivo chopper PLY

voltar ao topo

voltar ao topo

📃 Código
Triangulação de um objeto 3D:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

vertices = np.loadtxt('C:/dados/vertices_hind.txt')
faces = np.loadtxt('C:/dados/faces_hind.txt', int)

facesc = np.array(vertices[faces])

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

ax.add_collection3d(Poly3DCollection(facesc, facecolors = 'green', edgecolors = 'grey', 
    alpha = 0.25, linewidth = 0.1))

ax.set_xlim3d(np.min(vertices[:,0]), np.max(vertices[:,0]))
ax.set_ylim3d(np.min(vertices[:,1]), np.max(vertices[:,1]))
ax.set_zlim3d(np.min(vertices[:,2]), np.max(vertices[:,2]))

ax.set_box_aspect((np.ptp(vertices[:,0]), np.ptp(vertices[:,1]), np.ptp(vertices[:,2])))

plt.show()

📊 Arquivo dos vértices

📊 Arquivo das faces

voltar ao topo

6. Modelos de iluminação

Material da página 92 até a página 105.

📃 Código
Cena com eixos e um cilindro programados com VTK:
import vtkmodules.vtkRenderingOpenGL2
import vtkmodules.vtkInteractionStyle
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersSources import vtkCylinderSource
from vtkmodules.vtkRenderingAnnotation import vtkAxesActor
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)

def main():
    colors = vtkNamedColors()
    colors.SetColor("BkgColor", [0.95, 0.95, 1, 0])
    cylinder = vtkCylinderSource()
    cylinder.SetResolution(30)

    cylinderMapper = vtkPolyDataMapper()
    cylinderMapper.SetInputConnection(cylinder.GetOutputPort())

    cylinderActor = vtkActor()
    cylinderActor.SetMapper(cylinderMapper)
    cylinderActor.GetProperty().SetColor(colors.GetColor3d("Yellow"))
    cylinder.SetRadius(0.5)
    cylinder.SetHeight(1.5)
    cylinderActor.SetPosition(2,-1,1.5)
    cylinderActor.RotateZ(-30.0)
    cylinderActor.RotateX(-30.0)
    
    ren = vtkRenderer()
    renWin = vtkRenderWindow()
    renWin.AddRenderer(ren)
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    ren.AddActor(cylinderActor)
    axes = vtkAxesActor()
    ren.AddActor(axes)
    ren.SetBackground(colors.GetColor3d("BkgColor"))
    renWin.SetSize(500, 500)

    iren.Initialize()
    ren.ResetCamera()
    ren.GetActiveCamera().Zoom(1.2)
    renWin.Render()
    iren.Start()
if __name__ == '__main__':
    main()

voltar ao topo

📃 Etapas da renderização de uma cena com VTK

Vamos acompanhar o esquema com as etapas da criação de uma cena usando a biblioteca VTK - Visualization Toolkit.

  • Depois de criarmos as ligações com as bibliotecas do VTK, podemos definir quais serão os atores da cena (polígonos, objetos 3D, poliedros e eixos).
  • Com os atores da cena definidos, utilizamos as propriedades para cada ator (cores, texturas, tamanhos e posições).
  • A renderização da cena pode ser definida com a inicialização da câmera.
  • Na etapa seguinte, definimos a iluminação da cena (posição, tipo de iluminação e cor).
  • A janela de visualização deve ser definida, onde serão mostrados os elementos programados da cena.
  • Para finalizar, podemos indicar quais serão os tipos de interação usados pelo usuário com os atores da cena.

voltar ao topo

voltar ao topo

📃 Código
Variação de iluminação ambiente com VTK:
import vtkmodules.vtkInteractionStyle
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkFiltersSources import vtkCylinderSource
from vtkmodules.vtkRenderingAnnotation import vtkAxesActor
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkLight,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)

def main():
    colors = vtkNamedColors()
    colors.SetColor('bkg', [0.65, 0.75, 0.99, 0])
    sphere = vtkSphereSource()
    sphere.SetThetaResolution(100)
    sphere.SetPhiResolution(50)
    sphere.SetRadius(0.3)
    cylinder = vtkCylinderSource()
    cylinder.SetResolution(30)
    cylinder.SetRadius(0.3)
    cylinder.SetHeight(0.7)

    sphereMapper = vtkPolyDataMapper()
    cylinderMapper = vtkPolyDataMapper()
    sphereMapper.SetInputConnection(sphere.GetOutputPort())
    cylinderMapper.SetInputConnection(cylinder.GetOutputPort())

    quantidade = 8
    spheres = list()
    cylinders = list()
    ambient = 0.125
    diffuse = 0.0
    specular = 0.0
    position = [1.5, 0, 0]
    position1 = [2, 0, -0.5]
    for i in range(0, quantidade):
        spheres.append(vtkActor())
        spheres[i].SetMapper(sphereMapper)
        spheres[i].GetProperty().SetColor(colors.GetColor3d('Red'))
        spheres[i].GetProperty().SetAmbient(ambient)
        spheres[i].GetProperty().SetDiffuse(diffuse)
        spheres[i].GetProperty().SetSpecular(specular)
        spheres[i].AddPosition(position)
        cylinders.append(vtkActor())
        cylinders[i].SetMapper(cylinderMapper)
        cylinders[i].GetProperty().SetColor(colors.GetColor3d('Blue'))
        cylinders[i].GetProperty().SetAmbient(ambient)
        cylinders[i].GetProperty().SetDiffuse(diffuse)
        cylinders[i].GetProperty().SetSpecular(specular)
        cylinders[i].AddPosition(position1)
        ambient += 0.125
        position[0] += 1.25
        position1[0] += 1.25
        if i == 3:
            position[0] = 1.5
            position[1] = -1
            position1[0] = 2
            position1[1] = -1

    ren = vtkRenderer()
    axes = vtkAxesActor()
    ren.AddActor(axes)
    renWin = vtkRenderWindow()
    renWin.AddRenderer(ren)
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    for i in range(0, quantidade):
        ren.AddActor(spheres[i])
        ren.AddActor(cylinders[i])

    ren.SetBackground(colors.GetColor3d('bkg'))
    renWin.SetSize(940, 480)
    renWin.SetWindowName('AmbientSpheres')

    light = vtkLight()
    light.SetFocalPoint(1.8, 0.6, 0)
    light.SetPosition(0.8, 1.6, 1)
    ren.AddLight(light)

    iren.Initialize()
    renWin.Render()
    iren.Start()
if __name__ == '__main__':
    main()

voltar ao topo

📃 Código
Variação de iluminação specular com VTK:
import vtkmodules.vtkRenderingOpenGL2
import vtkmodules.vtkInteractionStyle
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkFiltersSources import vtkCylinderSource
from vtkmodules.vtkRenderingAnnotation import vtkAxesActor
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkLight,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)

def main():
    colors = vtkNamedColors()
    colors.SetColor('bkg', [0.65, 0.75, 0.99, 0])
    sphere = vtkSphereSource()
    sphere.SetThetaResolution(100)
    sphere.SetPhiResolution(50)
    sphere.SetRadius(0.3)
    cylinder = vtkCylinderSource()
    cylinder.SetResolution(30)
    cylinder.SetRadius(0.3)
    cylinder.SetHeight(0.7)

    sphereMapper = vtkPolyDataMapper()
    cylinderMapper = vtkPolyDataMapper()
    sphereMapper.SetInputConnection(sphere.GetOutputPort())
    cylinderMapper.SetInputConnection(cylinder.GetOutputPort())

    quantidade = 8
    spheres = list()
    cylinders = list()
    ambient = 0.8
    diffuse = 0.0
    specular = 0.125
    specularPower = 1
    position = [1.5, 0, 0]
    position1 = [2, 0, -0.5]
    for i in range(0, quantidade):
        spheres.append(vtkActor())
        spheres[i].SetMapper(sphereMapper)
        spheres[i].GetProperty().SetColor(colors.GetColor3d('Red'))
        spheres[i].GetProperty().SetAmbient(ambient)
        spheres[i].GetProperty().SetDiffuse(diffuse)
        spheres[i].GetProperty().SetSpecular(specular)
        spheres[i].GetProperty().SetSpecularPower(specularPower)
        spheres[i].GetProperty().SetSpecularColor(colors.GetColor3d('White'))
        spheres[i].AddPosition(position)
        cylinders.append(vtkActor())
        cylinders[i].SetMapper(cylinderMapper)
        cylinders[i].GetProperty().SetColor(colors.GetColor3d('Blue'))
        cylinders[i].GetProperty().SetAmbient(ambient)
        cylinders[i].GetProperty().SetDiffuse(diffuse)
        cylinders[i].GetProperty().SetSpecular(specular)
        cylinders[i].GetProperty().SetSpecularPower(specularPower)
        cylinders[i].GetProperty().SetSpecularColor(colors.GetColor3d('White'))
        cylinders[i].AddPosition(position1)
        specular += 0.125
        specularPower += 0.5
        position[0] += 1.25
        position1[0] += 1.25
        if i == 3:
            position[0] = 1.5
            position[1] = -1
            position1[0] = 2
            position1[1] = -1

    ren = vtkRenderer()
    axes = vtkAxesActor()
    ren.AddActor(axes)
    renWin = vtkRenderWindow()
    renWin.AddRenderer(ren)
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    for i in range(0, quantidade):
        ren.AddActor(spheres[i])
        ren.AddActor(cylinders[i])

    ren.SetBackground(colors.GetColor3d('bkg'))
    renWin.SetSize(940, 480)
    renWin.SetWindowName('AmbientSpheres')

    light = vtkLight()
    light.SetFocalPoint(1.8, 0.6, 0)
    light.SetPosition(0.8, 1.6, 1)
    ren.AddLight(light)

    iren.Initialize()
    renWin.Render()
    iren.Start()
if __name__ == '__main__':
    main()

voltar ao topo

📃 Código
Iluminação de 2 fontes de luz com VTK:
import vtkmodules.vtkRenderingOpenGL2
import vtkmodules.vtkInteractionStyle
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkRenderingFreeType import vtkVectorText
from vtkmodules.vtkFiltersSources import vtkCylinderSource
from vtkmodules.vtkRenderingAnnotation import vtkAxesActor
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkLight,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkFollower,
    vtkRenderWindowInteractor,
    vtkRenderer
)

def main():
    colors = vtkNamedColors()
    colors.SetColor('bkg', [0.65, 0.75, 0.99, 0])
    sphere = vtkSphereSource()
    sphere.SetThetaResolution(100)
    sphere.SetPhiResolution(50)
    sphere.SetRadius(0.3)
    cylinder = vtkCylinderSource()
    cylinder.SetResolution(30)
    cylinder.SetRadius(0.3)
    cylinder.SetHeight(0.7)

    sphereMapper = vtkPolyDataMapper()
    cylinderMapper = vtkPolyDataMapper()
    sphereMapper.SetInputConnection(sphere.GetOutputPort())
    cylinderMapper.SetInputConnection(cylinder.GetOutputPort())

    spheres = list()
    cylinders = list()
    ambient = 0.8
    diffuse = 0.0
    specular = 0.75
    specularPower = 4
    position = [1.5, 0, 0]
    position1 = [2, 0, -0.5]
    spheres.append(vtkActor())
    spheres[0].SetMapper(sphereMapper)
    spheres[0].GetProperty().SetColor(colors.GetColor3d('Red'))
    spheres[0].GetProperty().SetAmbient(ambient)
    spheres[0].GetProperty().SetDiffuse(diffuse)
    spheres[0].GetProperty().SetSpecular(specular)
    spheres[0].GetProperty().SetSpecularPower(specularPower)
    spheres[0].GetProperty().SetSpecularColor(colors.GetColor3d('White'))
    spheres[0].AddPosition(position)
    cylinders.append(vtkActor())
    cylinders[0].SetMapper(cylinderMapper)
    cylinders[0].GetProperty().SetColor(colors.GetColor3d('Blue'))
    cylinders[0].GetProperty().SetAmbient(ambient)
    cylinders[0].GetProperty().SetDiffuse(diffuse)
    cylinders[0].GetProperty().SetSpecular(specular)
    cylinders[0].GetProperty().SetSpecularPower(specularPower)
    cylinders[0].GetProperty().SetSpecularColor(colors.GetColor3d('White'))
    cylinders[0].AddPosition(position1)
    atext = vtkVectorText()
    atext.SetText('Fonte 1')
    textMapper = vtkPolyDataMapper()
    textMapper.SetInputConnection(atext.GetOutputPort())
    textActor = vtkFollower()
    textActor.SetMapper(textMapper)
    textActor.SetScale(0.2, 0.2, 0.2)
    textActor.AddPosition(-3, 2, 0)
    atext1 = vtkVectorText()
    atext1.SetText('Fonte 2')
    textMapper = vtkPolyDataMapper()
    textMapper.SetInputConnection(atext1.GetOutputPort())
    textActor1 = vtkFollower()
    textActor1.SetMapper(textMapper)
    textActor1.SetScale(0.2, 0.2, 0.2)
    textActor1.AddPosition(3, 2, 0)

    ren = vtkRenderer()
    axes = vtkAxesActor()
    ren.AddActor(axes)
    renWin = vtkRenderWindow()
    renWin.AddRenderer(ren)
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)
    ren.AddActor(textActor)
    ren.AddActor(textActor1)
    ren.AddActor(spheres[0])
    ren.AddActor(cylinders[0])

    ren.SetBackground(colors.GetColor3d('bkg'))
    renWin.SetSize(940, 480)
    renWin.SetWindowName('AmbientSpheres')

    light = vtkLight()
    light.SetFocalPoint(1.8, 0.6, 0)
    light.SetPosition(-3, 2, 0)
    ren.AddLight(light)
        
    light1 = vtkLight()
    light1.SetFocalPoint(1.8, 0.6, 0)
    light1.SetPosition(3, 2, 0)
    ren.AddLight(light1)

    iren.Initialize()
    renWin.Render()
    iren.Start()
if __name__ == '__main__':
    main()

voltar ao topo

📃 Código
Criação de uma cena com Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/chopper.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()

p = pv.Plotter(lighting = 'none', window_size = [1000, 1000])
p.show_grid()
p.show_axes()

light = pv.Light(position = (-10, 1, 1), light_type = 'scene light')
p.add_light(light)
light = pv.Light(position = (10, 1, 1), light_type = 'scene light')
p.add_light(light)

p.set_background('royalblue', top = 'aliceblue')
p.add_mesh(mesh, color = 'Red', show_edges = True, edge_color = 'grey', ambient = 0.3, 
    diffuse = 0.5, specular = 0.5, specular_power = 15)

p.show()

voltar ao topo

📃 Código
Criação de uma cena com Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/chopper.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()

p = pv.Plotter(lighting = 'none', window_size = [1000, 1000])
p.show_grid()
p.show_axes()

light = pv.Light(position = (-10, 1, 1), light_type = 'scene light')
p.add_light(light)
light = pv.Light(position = (10, 1, 1), light_type = 'scene light')
p.add_light(light)

p.set_background('royalblue', top = 'aliceblue')
p.add_mesh(mesh, cmap = 'Greens', scalars = mesh.points[:, 2], show_scalar_bar = False, 
    show_edges = True, edge_color = 'grey', ambient = 0.3, diffuse = 0.5, specular = 0.5, 
    specular_power = 15)

p.show()

voltar ao topo

voltar ao topo

📃 Código
Criação de sombras em objetos de uma cena com Pyvista:
import pyvista
import pyvista as pv
import numpy as np

filename = 'C:/dados/chopper.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()

p = pv.Plotter(lighting = None, window_size = [1000, 1000])
p.show_axes()

maxx = np.max(mesh.points[:, 0])
maxy = np.max(mesh.points[:, 1])
minx = np.min(mesh.points[:, 0])
miny = np.min(mesh.points[:, 1])
minz = np.min(mesh.points[:, 2])
maxz = np.max(mesh.points[:, 2])

light = pv.Light(position = [(maxx + minx)/2, (maxy + miny)/2, maxz + 150], 
    focal_point = [(maxx + minx)/2, (maxy + miny)/2, 0], show_actor = True, 
    positional = True, cone_angle = 45, exponent = 50, intensity = 30)
p.add_light(light)

p.set_background('royalblue', top = 'aliceblue')
p.add_mesh(mesh, color = 'Green', show_edges = False, ambient = 0.3, diffuse = 0.5, 
    specular = 1, specular_power = 15, opacity = 1, metallic = 0.3, roughness = 0.6, pbr = True)

grid = pv.Plane(i_size = 5*(maxx - minx), j_size = 2*(maxy + miny), 
    center = [(maxx + minx)/2, (maxy + miny)/2, minz - 10])
p.add_mesh(grid, color = 'white')
p.enable_shadows()

p.show()

voltar ao topo

voltar ao topo

📃 Código
Criação de poliedros em uma cena do Pyvista:
import pyvista as pv

kinds = ['tetrahedron', 'cube', 'octahedron', 'dodecahedron', 'icosahedron']
centers = [(-1, 0, 0), (-1, 1, 0), (-1, 2, 0), (0, 1.5, 0), (0, 0.5, 0)]

solids = [pv.PlatonicSolid(kind, radius = 0.4, center = center) for kind, 
    center in zip(kinds, centers)]
colors = ['aqua', 'red', 'orange', 'yellow', 'white']

p = pv.Plotter(lighting = 'none', window_size = [1000, 1000])
p.set_background('royalblue', top = 'aliceblue')

for ind, solid in enumerate(solids):
    p.add_mesh(solid, colors[ind], ambient = 0.3, smooth_shading = True, show_edges = True,
    diffuse = 0.8, specular = 0.5, specular_power = 2)

p.add_floor('-z', lighting = True, color = 'white', pad = 0.4)
p.show_axes()

p.add_light(pv.Light(position = (1, -1, 5), focal_point = (0, 0, 0), color = 'white', 
    intensity = 0.8))
p.enable_shadows()

p.show()
📃 Código
Inserção de uma superfície em uma cena do Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/everest.obj'
reader = pyvista.get_reader(filename)
mesh = reader.read()

p = pv.Plotter(lighting = 'none', window_size = [1000, 1000])
p.show_grid()
p.show_axes()

light = pv.Light(position = (10, 1, 1), light_type = 'scene light', intensity = 32)
p.add_light(light)

p.set_background('royalblue', top = 'white')
p.add_mesh(mesh, cmap = 'coolwarm_r', scalars = mesh.points[:, 2], show_scalar_bar = False,
    ambient = 0.3, diffuse = 0.5, specular = 0.5, specular_power = 15, pbr = True, 
    metallic = 0.5, roughness = 0.2)

p.show()

📊 Arquivo OBJ - Monte Everest

📊 Arquivo OBJ - montanhas de Palcoyo

voltar ao topo

voltar ao topo

7. Câmera e Realidade Virtual - parte I

Material da página 105 até a página 130.

📃 Código
Projeção ortogonal (paralela) do Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/galleon.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()
p = pv.Plotter(lighting = 'none', window_size = [1000, 1000])
p.enable_parallel_projection()
p.show_grid(color="grey")
p.show_axes()

light = pv.Light(position = (10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)
light = pv.Light(position = (-10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)

p.set_background('white', top = 'white')

p.add_mesh(mesh, cmap = 'GnBu_r', scalars = mesh.points[:, 2], show_scalar_bar = False,
    ambient = 0.3, diffuse = 0.5, specular = 0.5, specular_power = 15)

p.show()

voltar ao topo

📃 Código
Zoom e Clipping plane da cena do Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/galleon.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()
p = pv.Plotter(lighting = 'none', window_size = [1000, 1000])
p.show_axes()

light = pv.Light(position = (10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)
light = pv.Light(position = (-10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)

p.set_background('white', top = 'white')

p.add_mesh(mesh, cmap = 'GnBu_r', scalars = mesh.points[:, 2], show_scalar_bar = False,
      	ambient = 0.3, diffuse = 0.5, specular = 0.5, specular_power = 15)

p.camera.zoom(0.8)
p.camera.clipping_range = (1000, 2500)
print(p.camera.clipping_range)

p.show()

voltar ao topo

📃 Código
Ponto focal da câmera em uma cena do Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/galleon.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()
p = pv.Plotter(lighting = 'none', window_size = [1000, 1000])
p.show_axes()

light = pv.Light(position = (10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)
light = pv.Light(position = (-10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)

p.set_background('white', top = 'white')

p.add_mesh(mesh, cmap = 'GnBu_r', scalars = mesh.points[:, 2], show_scalar_bar = False,
      	ambient = 0.3, diffuse = 0.5, specular = 0.5, specular_power = 15)

p.camera.focal_point = (300, 0, -250)

p.show()
📃 Código
Ângulo de visualização da câmera do Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/galleon.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()
p = pv.Plotter(lighting = 'none', window_size = [1000, 1000])
p.show_axes()

light = pv.Light(position = (10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)
light = pv.Light(position = (-10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)

p.set_background('white', top = 'white')

p.add_mesh(mesh, cmap = 'GnBu_r', scalars = mesh.points[:, 2], show_scalar_bar = False,
      	ambient = 0.3, diffuse = 0.5, specular = 0.5, specular_power = 15)

p.camera.view_angle = 155.0

p.show()
📃 Código
Posição da câmera em uma cena do Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/galleon.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()
p = pv.Plotter(lighting = 'none', window_size = [1000, 1000])
p.show_axes()

light = pv.Light(position = (10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)
light = pv.Light(position = (-10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)

p.set_background('white', top = 'white')

p.add_mesh(mesh, cmap = 'GnBu_r', scalars = mesh.points[:, 2], show_scalar_bar = False,
      	ambient = 0.3, diffuse = 0.5, specular = 0.5, specular_power = 15)

p.camera.position = (1800, 1800, 0)

p.show()

voltar ao topo

📃 Código
Ângulos elevation, azimuth e roll da câmera do Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/galleon.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()
p = pv.Plotter(lighting = 'none', window_size = [1000, 1000])
p.show_axes()

light = pv.Light(position = (10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)
light = pv.Light(position = (-10, 1, 1), light_type = 'scene light', intensity = 1.5)
p.add_light(light)

p.set_background('white', top = 'white')

p.add_mesh(mesh, cmap = 'GnBu_r', scalars = mesh.points[:, 2], show_scalar_bar = False,
      	ambient = 0.3, diffuse = 0.5, specular = 0.5, specular_power = 15)

p.camera_position = 'xy'
p.camera.elevation = 45
p.camera.azimuth = 0
p.camera.roll = 0

p.show()

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

📃 Código
CubeMap em uma cena do Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/galleon.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()
mesh.rotate_x(-90.0)

p = pv.Plotter()
p.show_axes()
light = pv.Light(position = (-10, 1, 1), light_type = 'scene light')
p.add_light(light)

cubemap = pyvista.cubemap('C:/dados/cubemap')
p.add_actor(cubemap.to_skybox())
p.set_environment_texture(cubemap)

p.add_mesh(mesh, cmap = 'GnBu_r', scalars = mesh.points[:, 1], show_scalar_bar = False, 
    diffuse = 0.9, pbr = True, metallic = 0.8, roughness = 0.1)

p.add_axes()
p.camera.roll = 0

p.show()

📊 Arquivos que formam o Cubemap do fundo da cena

voltar ao topo

📃 Código
CubeMap em uma cena do Pyvista:
import pyvista
import pyvista as pv

filename = 'C:/dados/chopper.ply'
reader = pyvista.get_reader(filename)
mesh = reader.read()
mesh.rotate_x(-90.0)

p = pv.Plotter()
p.show_axes()
light = pv.Light(position = (-10, 1, 1), light_type = 'scene light')
p.add_light(light)

cubemap = pyvista.cubemap('C:/dados/cubemap1')
p.add_actor(cubemap.to_skybox())
p.set_environment_texture(cubemap)

p.add_mesh(mesh, cmap = 'Reds_r', scalars = mesh.points[:, 1], show_scalar_bar = False, 
    diffuse = 0.9, pbr = True, metallic = 0.8, roughness = 0.1)

p.add_axes()
p.camera.roll=0
p.show()

📊 Arquivos que formam o Cubemap do fundo da cena

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

📃 Código

Veja o código HTML e a renderização da cena.

  • Cena de RV com um cubo, com fundo azul:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene>
           <a-box color="green" position="0 2 -4" rotation="0 45 45" scale="2 2 3"></a-box>
           <a-sky color="#99ccff"></a-sky>
        </a-scene>
      </body>
    </html>
    
  • Cena de RV com um cubo, sem imagem de fundo.
    🔗 link da página
📃 Código

Veja o código HTML e a renderização da cena.

  • Cena de RV com um cubo, com ambientes forest e japan:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
        <script src="https://unpkg.com/aframe-environment-component/dist/aframe-environment-component.min.js"></script>
      </head>
      <body>
        <a-scene>
           <a-box color="green" position="0 2 -4" rotation="0 45 45" scale="2 2 3"></a-box>
           <a-entity environment="preset: forest; dressingAmount: 500"></a-entity>
        </a-scene>
      </body>
    </html>
    
  • Combinação das teclas WASD usada para a movimentação de personagens em cenas de Realidade Virtual e jogos 3D.
  • Cena de RV com um cubo, com ambiente forest.
    🔗 link da página
  • Cena de RV com um cubo, com ambiente japan. Modifique a tag do ambiente no código para inserir o cubo em outros ambientes do a-frame.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Cena de RV com imagem equiretangular de fundo:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene>
           <a-assets>
              <img id="ceu" src="./imagens/equi1.jpg">
              <img id="textura1" src="./imagens/textura1.jpg">
              <img id="textura2" src="./imagens/textura2.jpg">  
           </a-assets>
           <a-box src="#textura1" position="0 1 -4" rotation="0 45 45" scale="1 1 1.5"></a-box>
           <a-cylinder src="#textura2" position="2.5 1 -4" radius="0.5" height="2"></a-cylinder>
           <a-sky src="#ceu"></a-sky>
        </a-scene>
      </body>
    </html>
    
  • Cena de RV com um cubo, com imagem equiretangular de fundo.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Cena de RV da representação da Terra e da Lua:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene>
           <a-assets>
              <img id="ceu" src="./imagens/2k_stars_milky_way.jpg">
              <img id="textura1" src="./imagens/2k_earth_daymap.jpg">
              <img id="textura2" src="./imagens/2k_moon.jpg">  
           </a-assets>
           <a-sphere src="#textura1" position="0 2 -4" scale="2 2 2"></a-sphere>
           <a-sphere src="#textura2" position="4 3 -4" scale="0.5 0.5 0.5"></a-sphere>
           <a-sky src="#ceu"></a-sky>
        </a-scene>
      </body>
    </html>
    
  • Cena de RV da representação da Terra e da Lua.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Iluminação ambiente em uma cena de RV:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene>
           <a-plane color="#A9F5D0" position="0 2 -6" width="8" height="4" ></a-plane>
           <a-plane color="#A9F5D0" position="0 0 -4" rotation="-90 0 0" width="8" height="4"></a-plane>
           <a-plane color="#A9F5D0" position="-4 2 -4" rotation="0 90 0" width="4" height="4"></a-plane>
           <a-box color="#F7819F" position="0 2 -4" rotation="0 45 45" scale="2 2 2" ></a-box>
           <a-sky color="#66ccff"></a-sky>
           <a-light type="ambient" color="white" intensity="0.8"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Iluminação ambiente em uma cena de RV.
    🔗 link da página
📃 Código

Veja o código HTML e a renderização da cena.

  • Iluminação direcional em uma cena de RV:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene>
           <a-plane color="#A9F5D0" position="0 2 -6" width="8" height="4" ></a-plane>
           <a-plane color="#A9F5D0" position="0 0 -4" rotation="-90 0 0" width="8" height="4"></a-plane>
           <a-plane color="#A9F5D0" position="-4 2 -4" rotation="0 90 0" width="4" height="4"></a-plane>
           <a-box color="#F7819F" position="0 2 -4" rotation="0 45 45" scale="2 2 2" ></a-box>
           <a-sky color="#66ccff"></a-sky>
           <a-light type="directional" intensity="1.5" position="3 3 3" target="#directionaltarget">
              <a-entity id="directionaltarget" position="-1 -1 -1"></a-entity>
           </a-light>
        </a-scene>
      </body>
    </html>
    
  • Iluminação direcional em uma cena de RV.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Iluminação hemisférica:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene shadow="type: pcfsoft">
           <a-plane color="#A9F5D0" position="0 2 -6" width="8" height="4" 
              shadow="receive: true"></a-plane>
           <a-plane color="#A9F5D0" position="0 0 -4" rotation="-90 0 0" width="8" height="4" 
              shadow="receive: true"></a-plane>
           <a-plane color="#A9F5D0" position="-4 2 -4" rotation="0 90 0" width="4" height="4" 
              shadow="receive: true"></a-plane>
           <a-box color="#F7819F" position="0 2 -4" rotation="0 45 45" scale="2 2 2" 
              shadow="cast: true"></a-box>
           <a-sky color="#66ccff"></a-sky>
           <a-light type="hemisphere" color="#eaeaea" light="groundColor: green" 
              intensity="0.7"></a-light>
           <a-light type="directional" intensity="0.5" position="8 5 5" light="castShadow:true"
             target="#directionaltargetZ">
                 <a-entity id="directionaltargetZ" position="-1.3 -1 -1"></a-entity>
           </a-light>
        </a-scene>
      </body>
    </html>
    
  • Iluminação hemisférica.
    🔗 link da página
📃 Código

Veja o código HTML e a renderização da cena.

  • Iluminação ponto:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene shadow="type: pcfsoft">
           <a-plane color="#A9F5D0" position="0 2 -6" width="8" height="4" 
              shadow="receive: true"></a-plane>
           <a-plane color="#A9F5D0" position="0 0 -4" rotation="-90 0 0" width="8" height="4" 
              shadow="receive: true"></a-plane>
           <a-plane color="#A9F5D0" position="-4 2 -4" rotation="0 90 0" width="4" height="4" 
              shadow="receive: true"></a-plane>
           <a-box color="#F7819F" position="0 2 -4" rotation="0 45 45" scale="2 2 2" 
              shadow="cast: true"></a-box>
           <a-sky color="#66ccff"></a-sky>
           <a-light type="hemisphere" color="#eaeaea" light="groundColor:green" 
              intensity="0.7"></a-light>
           <a-light type="point" intensity="0.75" distance="50" decay="7" position="0 3 0" 
              light="castShadow: true"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Iluminação ponto.
    🔗 link da página
📃 Código

Veja o código HTML e a renderização da cena.

  • Iluminação spot:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene shadow="type: pcfsoft">
           <a-plane color="#A9F5D0" position="0 2 -6" width="8" height="4" 
              shadow="receive: true"></a-plane>
           <a-plane color="#A9F5D0" position="0 0 -4" rotation="-90 0 0" width="8" height="4" 
              shadow="receive: true"></a-plane>
           <a-plane color="#A9F5D0" position="-4 2 -4" rotation="0 90 0" width="4" height="4" 
              shadow="receive: true"></a-plane>
           <a-box color="#F7819F" position="0 2 -4" rotation="0 45 45" scale="2 2 2" 
              shadow="cast: true"></a-box>
           <a-sky color="#66ccff"></a-sky>
           <a-light type="hemisphere" color="#eaeaea" light="groundColor:green" 
              intensity="0.7"></a-light>
           <a-light type="spot" intensity="0.75" angle="45" penumbra="0.2" light="castShadow:true" 
              position="0 2 -0.5"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Iluminação spot.
    🔗 link da página

voltar ao topo

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Animação de uma esfera em torno do eixo z:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene shadow="type: pcfsoft">
           <a-entity position="-1 0.5 -4">
              <a-cylinder radius="0.02" height="3" position="0 0.5 0" 
                 color="rgb(0,255,0)"></a-cylinder>
              <a-cylinder rotation="0 0 90" radius="0.02" height="3" position="0.5 0 0" 
                 color="rgb(255,0,0)"></a-cylinder>
              <a-cylinder rotation="90 0 0" radius="0.02" height="3" position="0 0 0.5" 
                 color="rgb(0,0,255)"></a-cylinder>
              <a-text position="0.05 -0.1 0" value="O" width="4" color="black"></a-text>
              <a-text position="2 0 0" value="x" width="4" color="black"></a-text>
              <a-text position="0 2 0" value="y" width="4" color="black"></a-text>
              <a-text position="0 0 2" value="z" width="4" color="black"></a-text>
              <a-torus position="0 0 1"radius="1.1" radius-tubular="0.01" segments-tubular="100" 
                 opacity="0.2"></a-torus>
              <a-entity animation="property: rotation; to: 0 0 360; loop: true; 
                dir: alternate; dur: 10000;">
                   <a-sphere position="0.5 1 1" radius="0.1" color="rgb(200,30,100)" ></a-sphere>
              </a-entity>
           </a-entity>
           <a-sky color="#66ccff"></a-sky>
        </a-scene>
      </body>
    </html>
    
  • Animação da esfera em torno do eixo z.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Animação da Lua em torno do centro da Terra:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene shadow="type: pcfsoft">
           <a-assets>
              <img id="ceu" src="./imagens/2k_stars_milky_way.jpg">
              <img id="textura1" src="./imagens/2k_earth_daymap.jpg">
              <img id="textura2" src="./imagens/2k_moon.jpg">  
           </a-assets>
           <a-entity position="0 2 -4" rotation="0 0 30"> 
              <a-entity rotation="0 0 -30">
                  <a-sphere src="#textura1" scale="2 2 2" animation="property: rotation; from: 0 0 0; 
                    to: 0 360 0; loop: true; dur: 10000; easing: linear;"></a-sphere>
              </a-entity>
              <a-entity animation="property: rotation; from: 0 360 0; to: 0 0 0; loop: true; 
                dur: 5000; easing: linear">
                  <a-sphere position="3 0 0" src="#textura2" scale="0.5 0.5 0.5" ></a-sphere>
              </a-entity>
           </a-entity>
           <a-sky src="#ceu"></a-sky>
           <a-light type="hemisphere" color="#eaeaea" light="groundColor:green" 
             intensity="0.7"></a-light>
           <a-light type="point" intensity="0.75" distance="50" decay="2" position="0 3 0" 
             light="castShadow: true"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Animação da Lua em torno do centro da Terra.
    🔗 link da página
📃 Código

Veja o código HTML e a renderização da cena.

  • Animação com mudanças de cores:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene shadow="type: pcfsoft">
           <a-icosahedron color="blue" position="1 1.5 -4" radius="1.5" 
             animation="property: components.material.material.color; type: color; to: red; 
             loop: true; dir: alternate; dur: 5000;"></a-icosahedron>
           <a-sky color="aliceblue" animation="property: components.material.material.color; 
             type: color; to: aqua; loop: true; dir: alternate; dur: 7000;"></a-sky>
           <a-light type="hemisphere" color="#eaeaea" light="groundColor:green" 
             intensity="0.7"></a-light>
           <a-light type="point" intensity="0.75" distance="50" decay="2" position="0 3 0" 
             light="castShadow: true"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Animação com mudanças de cores.
    🔗 link da página
📃 Código

Veja o código HTML e a renderização da cena.

  • Animação com mudanças de cores:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene shadow="type: pcfsoft">
           <a-plane color="#A9F5D0" position="0 2 -6" width="8" height="4" 
             shadow="receive: true"></a-plane>
           <a-plane color="#A9F5D0" position="0 0 -4" rotation="-90 0 0" width="8" height="4" 
             shadow="receive: true"></a-plane>
           <a-plane color="#A9F5D0" position="-4 2 -4" rotation="0 90 0" width="4" height="4" 
             shadow="receive: true"></a-plane>
           <a-cone color="royalblue" position="0 2 -3" rotation="0 0 45" radius-bottom="0.75" 
             height="2.5" shadow="cast: true"></a-cone>
           <a-sky color="#66ccff"></a-sky>
           <a-light type="hemisphere" color="#eaeaea" light="groundColor:green" intensity="0.7" 
             animation="property: intensity; to: 0.2; loop: true; dir: alternate; dur: 5000;"></a-light>
           <a-light type="spot" intensity="0.75" angle="45" penumbra="0.2" light="castShadow:true" 
             position="0 2 -0.5"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Animação de intensidade de luz.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Animação com mudanças de cores:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene shadow="type: pcfsoft">
           <a-plane color="#A9F5D0" position="0 2 -6" width="8" height="4" 
             shadow="receive: true"></a-plane>
           <a-plane color="#A9F5D0" position="0 0 -4" rotation="-90 0 0" width="8" height="4" 
             shadow="receive: true"></a-plane>
           <a-plane color="#A9F5D0" position="-4 2 -4" rotation="0 90 0" width="4" height="4" 
             shadow="receive: true"></a-plane>
           <a-cone color="royalblue" position="0 2 -3" rotation="0 0 45" radius-bottom="0.75" 
             height="2.5" shadow="cast: true"></a-cone>
           <a-sky color="#66ccff"></a-sky>
           <a-light type="hemisphere" color="#eaeaea" light="groundColor:green" 
             intensity="0.7"></a-light>
           <a-light type="spot" intensity="0.75" angle="45" penumbra="0.2" light="castShadow:true" 
             position="-2 2 -0.5" animation="property: position; to: 2 2 -0.5; loop: true;
             dir: alternate; dur: 10000;"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Animação da posição da fonte de luz.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Propriedades da câmera:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
      </head>
      <body>
        <a-scene shadow="type: pcfsoft">
           <a-assets>
               <img id="arvore" src="./imagens/treebark.png">
           </a-assets>
           <a-camera position="0 2 2"></a-camera>
           <a-cylinder src="#arvore" position="0 2 0" radius="0.5" height="2" 
             metalness="0.6" roughness="0.3" side="double"></a-cylinder>
           <a-sky color="#66ccff"></a-sky>
           <a-light type="ambient" color="white" intensity="0.4"></a-light>
           <a-light type="directional" intensity="0.8" position="-1 0 0"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Posição da câmera.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Órbita da câmera e reflexão da imagem de fundo nos objetos:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
        <script src="https://unpkg.com/aframe-orbit-controls@1.3.0/dist/aframe-orbit-controls.min.js"></script>
      </head>
      <body>
        <a-scene reflection>
            <a-assets>
               <img id="ceu" src="./imagens/equi1.jpg">
               <img id="metal" src="./imagens/metal1.png">
               <a-cubemap id="ceu2">
                  <img src="./imagens/cubemap/Right.png">
                  <img src="./imagens/cubemap/Left.png">
                  <img src="./imagens/cubemap/Top.png">
                  <img src="./imagens/cubemap/Bottom.png">
                  <img src="./imagens/cubemap/Front.png">
                  <img src="./imagens/cubemap/Back.png">
               </a-cubemap>
            </a-assets>
            <a-sky src="#ceu"></a-sky>
            <a-camera orbit-controls="target: -1 1.5 1; minDistance: 0.5; maxDistance: 180; 
              initialPosition: -1 1.6 3.5"></a-camera>
            <a-sphere position="1 2 0.5" radius="1" side="double" color="silver" 
              metalness="1" roughness="0" segments-height="36" shadow="" segments-width="64" 
              material="envMap: #ceu2;"></a-sphere>
            <a-sphere position="-2 1.5 -0.5" color="green" radius="1" side="double" 
              metalness="1" roughness="0" segments-height="36" shadow="" segments-width="64" 
              material="envMap: #ceu2;"></a-sphere>		
            <a-cylinder src="#metal" position="-3 0.5 1.5" color="white" radius="0.5"
              height="1.5" side="double" metalness="1" roughness="0" shadow="" 
              material="envMap: #ceu2;"></a-cylinder>		
            <a-light type="ambient" color="#eaeaea" intensity="0.3"></a-light>
            <a-light type="spot" intensity="0.75" angle="60" penumbra="0.5" 
              shadow="cast: true; receive: false" position="-2 2 4"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Órbita da câmera e reflexão do fundo da cena nos objetos.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Órbita da câmera e reflexão da imagem de fundo e entre objetos:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.0.4/aframe.min.js"></script>
        <script src="./java/camera-cube-env.js"></script>
        <script src="https://unpkg.com/aframe-orbit-controls@1.3.0/dist/aframe-orbit-controls.min.js"></script>
      </head>
      <body>
        <a-scene reflection>
            <a-assets>
               <img id="ceu" src="./imagens/equi1.jpg">
               <img id="metal" src="./imagens/metal1.png">
            </a-assets>
            <a-sky src="#ceu"></a-sky>
            <a-camera orbit-controls="target: -1 1.5 1; minDistance: 0.5; maxDistance: 180; 
              initialPosition: -1 1.6 3.5"></a-camera>
            <a-sphere position="1 2 0.5" radius="1" side="double" color="silver" 
              metalness="1" roughness="0" segments-height="36" shadow="" segments-width="64" 
              camera-cube-env="distance: 500; resolution: 512; repeat: true; interval: 1;"></a-sphere>
            <a-sphere position="-2 1.5 -0.5" color="green" radius="1" side="double" 
              metalness="1" roughness="0" segments-height="36" shadow="" segments-width="64" 
              camera-cube-env="distance: 500; resolution: 512; repeat: true; interval: 1;"></a-sphere>
            <a-cylinder src="#metal" position="-3 0.5 1.5" color="white" radius="0.5"
              height="1.5" side="double" metalness="1" roughness="0" shadow="" 
              camera-cube-env="distance: 500; resolution: 512; repeat: true; interval: 1;"></a-cylinder>
            <a-light type="ambient" color="#eaeaea" intensity="0.3"></a-light>
            <a-light type="spot" intensity="0.75" angle="60" penumbra="0.5" 
              shadow="cast: true; receive: false" position="-2 2 4"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Órbita da câmera e reflexão do fundo e entre os objetos da cena.
    🔗 link da página

voltar ao topo

8. Realidade Virtual - parte II

Material da página 130 até a página 145.

📃 Código

Veja o código HTML e a renderização da cena.

  • Representação de poliedro com sombra em um plano:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
        <script src="https://unpkg.com/aframe-orbit-controls@1.3.0/dist/aframe-orbit-controls.min.js"></script>
      </head>
      <body>
        <a-scene reflection>
            <a-sky color="#66ccff"></a-sky>
            <a-entity camera orbit-controls="target: 0 2 0; minDistance: 0.5; maxDistance: 180; 
              initialPosition: -1 1.6 4.5"></a-entity>
            <a-octahedron position="0 2 0" radius="2" color="black" 
              wireframe="true" shadow="cast:true"></a-octahedron>
            <a-octahedron position="0 2 0" radius="2" side="double"
              color="tomato" metalness="0.6" roughness="0.3" opacity="0.5"></a-octahedron>
            <a-plane color="#A9F5D0" position="0 -0.5 0" rotation="-90 0 0" width="5" height="5"
              shadow="receive: true;"></a-plane>
            <a-light type="ambient" color="#eaeaea" intensity="0.3"></a-light>
            <a-light type="directional" intensity="0.3" position="0 5 0" 
              light="castShadow:true" target="#directionaltargetY">
                <a-entity id="directionaltargetY" position="0 -1 0"></a-entity>
            </a-light>
        </a-scene>
      </body>
    </html>
    
  • Octaedro com sombras projetadas em um plano, produzidas por meio de luz direcional.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Propriedades comuns de objetos agrupadas com a tag a-mixin:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
        <script src="https://unpkg.com/aframe-orbit-controls@1.3.0/dist/aframe-orbit-controls.min.js"></script>
      </head>
      <body>
        <a-scene reflection>
            <a-assets>
               <img id="ceu" src="./imagens/equi1.jpg">
               <img id="metal" src="./imagens/metal1.png">
               <a-cubemap id="ceu2">
                  <img src="./imagens/cubemap/Right.png">
                  <img src="./imagens/cubemap/Left.png">
                  <img src="./imagens/cubemap/Top.png">
                  <img src="./imagens/cubemap/Bottom.png">
                  <img src="./imagens/cubemap/Front.png">
                  <img src="./imagens/cubemap/Back.png">
               </a-cubemap>
               <a-mixin id="padrao" material="metalness:1; roughness:0; side:double; envMap: #ceu2;" 
                 shadow=""></a-mixin>
               <a-mixin id="padrao2" geometry="segments-height:36; segments-width:64; radius:1;"></a-mixin>
            </a-assets>
            <a-sky src="#ceu"></a-sky>
            <a-entity camera orbit-controls="target: -1 1.5 1; minDistance: 0.5; maxDistance: 180; 
              initialPosition: -1 1.6 3.5"></a-entity>
            <a-sphere position="1 2 0.5" color="silver" mixin="padrao padrao2"></a-sphere>
            <a-sphere position="-2 1.5 -0.5" color="green" mixin="padrao padrao2"></a-sphere>
            <a-cylinder src="#metal" position="-3 0.5 1.5" color="white" radius="0.5" 
              height="1.5" mixin="padrao"></a-cylinder>
            <a-light type="ambient" color="#eaeaea" intensity="0.3"></a-light>
            <a-light type="spot" intensity="0.75" angle="60" penumbra="0.5" 
              shadow="cast: true; receive: false" position="-2 2 4"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Propriedades agrupadas na tag a-mixin.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Construção de um poliedro usando a propriedade faceset:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.1.0/aframe.min.js"></script>
        <script src="https://unpkg.com/aframe-orbit-controls@1.3.0/dist/aframe-orbit-controls.min.js"></script>
        <script src="https://andreasplesch.github.io/aframe-faceset-component/dist/aframe-faceset-component.min.js"></script>
      </head>
      <body>
        <a-scene>
            <a-assets>
                <a-mixin id="aramado" material="color: red; wireframe: true; wireframe-linewidth:1;"></a-mixin>
                <a-mixin id="cor1" material="color: #d8ef09"></a-mixin>
                <a-mixin id="padrao" material="opacity: 0.5; side: double; metalness:0.3; roughness:0.9;"></a-mixin>
                <a-mixin id="texto" text="width: 4; side:double; color: black" rotation="-25 0 0">
            </a-assets>
            <a-sky color="#66ccff"></a-sky>
            <a-entity camera orbit-controls="target: 0 1 0.7; minDistance: 0.5; maxDistance: 180; 
              initialPosition: 0 1.6 3"></a-entity>
            <a-entity id="piramide_pentagonal_reta">
               <a-text position="-0.2 0 0" value="A" mixin="texto"></a-text>
               <a-text position="1.1 0 0" value="B" mixin="texto"></a-text>
               <a-text position="1.31 0 0.95" value="C" mixin="texto"></a-text>
               <a-text position="0.5 0 1.5" value="D" mixin="texto"></a-text>
               <a-text position="-0.45 0 0.95" value="E" mixin="texto"></a-text>
               <a-text position="0.5 2.1 0.7" value="V" mixin="texto"></a-text>
               <a-entity faceset="vertices: 0 0 0  1 0 0  1.31 0 0.95  0.5 0 1.5  -0.31 0 0.95" 
                 mixin="cor1 padrao"></a-entity>
               <a-entity faceset="vertices: 0 0 0  1 0 0  1.31 0 0.95  0.5 0 1.5  -0.31 0 0.95  0.5 2 0.7;
                 projectdir:y" mixin="cor1 padrao"></a-entity>
               <a-entity faceset="vertices: 0 0 0  1 0 0  1.31 0 0.95  0.5 0 1.5  -0.31 0 0.95  0.5 2 0.7; 
                 projectdir:y" mixin="aramado"></a-entity>
               <a-entity line="start: 0.5 2 0.7; end: 0.5 0 0.7; color: white" 
                 line__2="start: 0.5 0 0.7; end: 0.5 0 1.5; color: white"></a-entity>
            </a-entity>
            <a-light type="ambient" color="#eaeaea" intensity="0.3"></a-light>
            <a-light type="spot" intensity="0.6" position="1 1 3" light="castShadow:true"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Representação de uma pirâmide com rótulos nos vértices, altura e projeção de uma aresta na base.
    🔗 link da página

voltar ao topo

voltar ao topo

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

voltar ao topo

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Inserção de objeto GLTF na cena:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
        <script src="https://unpkg.com/aframe-orbit-controls@1.3.0/dist/aframe-orbit-controls.min.js"></script>
      </head>
      <body>
        <a-scene reflection shadow="type: pcfsoft">
            <a-assets>
                <a-asset-item id="objeto" src="objetos/robo/scene.gltf"></a-asset-item>
            </a-assets>
            <a-sky color="#66ccff"></a-sky>
            <a-entity camera orbit-controls="target: 0 0 0; minDistance: 0.5; maxDistance: 180; 
              initialPosition: 1 1 2.5"></a-entity>
            <a-entity position="0 0 0.5" scale="0.1 0.1 0.1">
                <a-gltf-model src="#objeto" shadow></a-gltf-model>
            </a-entity>
            <a-box scale="7 0.1 7" shadow color="rgb(100,180,100)"></a-box>
            <a-light type="ambient" color="#white" intensity="0.3"></a-light>
            <a-light type="directional" color="white" intensity="0.6" position="-1 1 1" 
              light="castShadow:true"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Objeto GLTF inserido na cena.
    🔗 link da página
📃 Código

Veja o código HTML e a renderização da cena.

  • Inserção de objeto GLTF com animação nativa na cena:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
        <script src="https://cdn.jsdelivr.net/gh/donmccurdy/aframe-extras@v6.1.1/dist/aframe-extras.min.js"></script>
        <script src="https://unpkg.com/aframe-orbit-controls@1.3.0/dist/aframe-orbit-controls.min.js"></script>
      </head>
      <body>
        <a-scene reflection shadow="type: pcfsoft">
            <a-assets>
                <a-asset-item id="objeto" src="objetos/mushroom/scene.gltf"></a-asset-item>
            </a-assets>
            <a-sky color="#66ccff"></a-sky>
            <a-entity camera orbit-controls="target: 0 0 0; minDistance: 0.05; maxDistance: 180; 
              initialPosition: 1 1 2.5"></a-entity>
            <a-entity position="0 0 0.5" scale="0.5 0.5 0.5">
                <a-gltf-model src="#objeto" shadow animation-mixer></a-gltf-model>
            </a-entity>
            <a-box scale="3.5 0.1 3.5" position="0 -0.07 0" shadow color="rgb(100,180,100)"></a-box>
            <a-light type="ambient" color="#white" intensity="0.4"></a-light>
            <a-light type="spot" intensity="0.7" color="white" position="-1 2 1" angle="80" 
              rotation="-90 0 0" penumbra="0.7" light="castShadow:true;"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Primeiro exemplo de objeto GLTF com animação nativa na cena.
    🔗 link da página
  • Segundo exemplo de objeto GLTF com animação nativa na cena.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Inserção de objeto GLTF com animação na cena:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
        <script src="https://unpkg.com/aframe-orbit-controls@1.3.0/dist/aframe-orbit-controls.min.js"></script>
      </head>
      <body>
        <a-scene reflection shadow="type: pcfsoft">
            <a-assets>
                <a-asset-item id="objeto" src="objetos/aviao.glb"></a-asset-item>
                <a-asset-item id="objeto1" src="objetos/helice.glb"></a-asset-item>
                <a-mixin id="texto" text="color: black; align: left; width: 8; side:double;"></a-mixin>
            </a-assets>
            <a-sky color="#66ccff"></a-sky>
            <a-entity camera="fov:20; near:1;" orbit-controls="target: 0 0 0; minDistance: 0.5; 
              maxDistance: 180; initialPosition: 5 7 21"></a-entity>
            <a-entity position="0 0 0" scale="0.8 0.8 0.8" rotation="0 -15 0">
                <a-gltf-model src="#objeto" shadow></a-gltf-model>
                <a-entity position="3.54 2.14 0.03" rotation="0 0 13.3">
                    <a-gltf-model src="#objeto1" animation="property: rotation; to: 360 0 0; loop: true; 
                      dur: 5000; easing: linear" shadow></a-gltf-model>
                </a-entity>
                <a-text position="0 0.15 3.5" mixin="texto" value="A airplane  |  design: Jeroen Hut" 
                  rotation="-45 0 0"></a-text>
            </a-entity>
            <a-box shadow scale="10 0.1 10" position="0 -0.05 0" color="rgb(100,180,100)"></a-box>
            <a-light type="ambient" color="#bbb" intensity="0.6"></a-light>
            <a-light type="directional" color="white" intensity="0.8" position="-1 1 1" 
              light="castShadow:true"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Exemplo de objeto GLTF com animação feita com a-frame.
    🔗 link da página

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Inserção de objeto GLTF para uso de teleporte:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
        <script src="https://fernandojsg.github.io/aframe-teleport-controls/dist/aframe-teleport-controls.min.js"></script>
      </head>
      <body>
        <a-scene reflection shadow="type: pcfsoft">
            <a-assets>
                <a-asset-item id="objeto" src="objetos/cave/scene.gltf"></a-asset-item>
                <a-mixin id="piso" geometry="height:0.1; width:10; depth:20;" shadow></a-mixin>
                <img id="ceu" src="imagens/equi4.jpg">
            </a-assets>
            <a-sky src="#ceu"></a-sky>
            <a-entity id="cameraRig" position="0.5 0 0">
                <a-camera id="head" wasd-controls look-controls></a-camera>
                <a-entity id="rhand" teleport-controls="cameraRig: #cameraRig; collisionEntities: [mixin='piso'];  
                  teleportOrigin: #head; button: grip;" hand-controls="hand: right"></a-entity>
                <a-entity id="lhand" teleport-controls="cameraRig: #cameraRig; collisionEntities: [mixin='piso']; 
                  teleportOrigin: #head; button: grip;" hand-controls="hand: left"></a-entity>
            </a-entity>
            <a-box mixin="piso" position="0 -0.55 0" visible="false"></a-box>
            <a-entity position="0 0 0">
                <a-gltf-model src="#objeto" shadow material="metallic:0.2; roughness:0.8;"></a-gltf-model>
            </a-entity>
            <a-light type="ambient" color="#eaeaea" intensity="0.3"></a-light>
            <a-light type="spot" intensity="0.7" position="1 1 3" light="castShadow:true" 
              rotation="-90 0 0" penumbra="0.5"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Primeiro exemplo de objeto GLTF com teleporte.
    🔗 link da página
  • Segundo exemplo de objeto GLTF com teleporte.
    🔗 link da página
📃 Código

Veja o código HTML e a renderização da cena.

  • Inserção de objeto OBJ em uma cena:
    <!DOCTYPE html>
    <html>
      <head>
        <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
        <script src="https://unpkg.com/aframe-orbit-controls@1.3.0/dist/aframe-orbit-controls.min.js"></script>
      </head>
      <body>
        <a-scene reflection shadow="type: pcfsoft" renderer='colorManagement: true;'>
            <a-assets>
                <a-asset-item id="objeto" src="objetos/bowling.obj"></a-asset-item>
                <a-asset-item id="objeto-mtl" src="objetos/bowling.mtl"></a-asset-item>
            </a-assets>
            <a-sky color="#66ccff"></a-sky>
            <a-entity camera orbit-controls="target: 0 0 0; minDistance: 0.05; maxDistance: 180; 
              initialPosition: 1 1 2"></a-entity>
            <a-entity position="0 0 0" scale="0.03 0.03 0.03" rotation="-90 0 0">
                <a-obj-model src="#objeto" mtl="#objeto-mtl" shadow ></a-obj-model>
            </a-entity>
            <a-box scale="3.5 0.1 3.5" position="0 -0.07 0" shadow color="rgb(100,180,100)"></a-box>
            <a-light type="ambient" color="#white" intensity="0.7"></a-light>
            <a-light type="spot" intensity="0.7" color="white" position="1 2 1" angle="80" rotation="-90 0 0" 
              penumbra="0.7" light="castShadow:true;"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Primeiro exemplo de objeto GLTF com teleporte.
    🔗 link da página

voltar ao topo

voltar ao topo

voltar ao topo

voltar ao topo

📃 Código

Veja o código HTML e a renderização da cena.

  • Cena com objetos GLTF, interação e teleporte:
    <!DOCTYPE html>
    <html>
      <head>
        <title>Pista de Boliche</title>
        <script src="https://aframe.io/releases/1.1.0/aframe.min.js"></script>
        <script src="https://unpkg.com/super-hands/dist/super-hands.min.js"></script>
        <script src="https://rawgit.com/donmccurdy/aframe-physics-system/v4.0.0/dist/aframe-physics-system.min.js"></script>
        <script src="https://unpkg.com/aframe-event-set-component@^4.1.1/dist/aframe-event-set-component.min.js"></script>
        <script src="https://unpkg.com/aframe-physics-extras/dist/aframe-physics-extras.min.js"></script>
        <script src="https://fernandojsg.github.io/aframe-teleport-controls/dist/aframe-teleport-controls.min.js"></script>
        <script> AFRAME.registerComponent('phase-shift', {
        init: function () {
          var el = this.el
            el.addEventListener('gripdown', function () {
              el.setAttribute('collision-filter', {collisionForces: true})
            })
            el.addEventListener('gripup', function () {
              el.setAttribute('collision-filter', {collisionForces: false})
            })
          }
        });
        </script>
      </head>
      <body>
        <a-scene shadow="type: pcfsoft">
            <a-assets>
               <a-mixin id="bola" geometry="radius: 0.3;" material="color: grey; metalness:0.8;" 
                 hoverable grabbable stretchable draggable droppable shadow dynamic-body="linearDamping:0.2; 
                 angularDamping:0.2; mass:7;" event-set__hoveron="_event: hover-start; material.opacity: 0.7; transparent: true" 
                 event-set__hoveroff="_event: hover-end; material.opacity: 1; transparent: false"></a-mixin>
               <a-mixin id="pino" scale="0.25 0.2 0.25" hoverable grabbable stretchable draggable droppable 
                 dynamic-body="linearDamping:0.3; angularDamping:0.3; mass:0.5;" shadow></a-mixin>
               <a-asset-item id="bow" src="objetos/bowling.gltf"></a-asset-item>
               <a-mixin static-body id="plataforma" geometry="height:0.1; width:18; depth:1.5;" 
                 material="src:#piso2; repeat:15 2; side:double; metalness:0.2; roughness:0.7" shadow></a-mixin>
               <a-mixin static-body id="lateral" material="src:#piso2; repeat:15 1; side:double; 
                 metalness:0.2; roughness:0.7" shadow></a-mixin>
               <a-mixin static-body id="piso" geometry="height:0.1; width:30; depth:15;" shadow
                 material="src:#piso1; repeat:27 14; side:double; metalness:0.2; roughness:0.7"></a-mixin>
               <img id="ceu" src="imagens/bowling.jpg">
               <img id="piso1" src="imagens/piso_madeira.jpg">
               <img id="piso2" src="imagens/piso.jpg">
               <a-mixin id="pointer" phase-shift raycaster="showLine: true; objects: .bola, a-sphere, 
    	     .pino, a-gltf" collision-filter="collisionForces: false" static-body="shape: sphere; sphereRadius: 0.02" 
    	     super-hands="colliderEvent: raycaster-intersection; colliderEventProperty: els; 
    	     colliderEndEvent: raycaster-intersection-cleared; colliderEndEventProperty: clearedEls;"></a-mixin>
               <a-mixin id="controle" mixin="pointer" hand-controls="hand: left"></a-mixin>
            </a-assets>
            <a-sky src="#ceu"></a-sky>
            <a-entity id="cameraRig" position="3 1.6 2">
               <a-camera id="head" look-controls wasd-controls position="0 1 2" cursor="rayOrigin:mouse" 
                 static-body="shape: sphere; sphereRadius: 0.001" super-hands="colliderEvent: raycaster-intersection; 
                 colliderEventProperty: els; colliderEndEvent: raycaster-intersection-cleared; 
                 colliderEndEventProperty: clearedEls;"></a-camera>
               <a-entity teleport-controls="cameraRig: #cameraRig; collisionEntities: [mixin='piso']; 
                 teleportOrigin: #head; button: grip;" hand-controls="hand: right" gearvr-controls daydream-controls></a-entity>
               <a-entity id="lhand" mixin="controle" super-hands></a-entity>
            </a-entity>
            <a-entity position="0 0 -2">
               <a-box mixin="piso" position="0 -0.1 0"></a-box>
               <a-box mixin="plataforma" position="0 -0.05 0"></a-box>
               <a-box mixin="lateral" scale="18.3 0.5 0.1" position="0 0.2 -0.8"></a-box>
               <a-box mixin="lateral" scale="18.3 0.5 0.1" position="0 0.2 0.8"></a-box>
               <a-entity id="suporte">
                  <a-box mixin="lateral" material="src:#piso2; repeat:2 2;" scale="2.1 0.5 0.1" 
                    position="8 0.2 -2.5"></a-box>
                  <a-box mixin="lateral" material="src:#piso2; repeat:2 2;" scale="2.1 0.5 0.1" 
                    position="8 0.2 -1.5" rotation="0 0 0"></a-box>
                  <a-box mixin="lateral" material="src:#piso2; repeat:2 2;" scale="0.9 0.5 0.1" 
                    position="7 0.2 -2" rotation="0 90 0"></a-box>
                  <a-box mixin="lateral" material="src:#piso2; repeat:2 2;" scale="0.9 0.5 0.1" 
                    position="9 0.2 -2" rotation="0 90 0"></a-box>
               </a-entity>
               <a-sphere class="bola" mixin="bola" position="7.5 0 -2"></a-sphere>
               <a-sphere class="bola" mixin="bola" position="8 0 -2"></a-sphere>
               <a-sphere class="bola" mixin="bola" position="8.5 0 0"></a-sphere>
               <a-entity position="0 0.7 0.1">
                  <a-gltf-model class="pino" src="#bow" position="-8.6 0 0.15" mixin="pino"></a-gltf-model>
                  <a-gltf-model class="pino" src="#bow" position="-8.6 0 -0.15" mixin="pino"></a-gltf-model>
                  <a-gltf-model class="pino" src="#bow" position="-8.6 0 0.45" mixin="pino"></a-gltf-model>
                  <a-gltf-model class="pino" src="#bow" position="-8.6 0 -0.45" mixin="pino"></a-gltf-model>
                  <a-gltf-model class="pino" src="#bow" position="-8.3 0 0" mixin="pino"></a-gltf-model>
                  <a-gltf-model class="pino" src="#bow" position="-8.3 0 -0.3" mixin="pino"></a-gltf-model>
                  <a-gltf-model class="pino" src="#bow" position="-8.3 0 0.3" mixin="pino"></a-gltf-model>
                  <a-gltf-model class="pino" src="#bow" position="-8 0 0.15" mixin="pino"></a-gltf-model>
                  <a-gltf-model class="pino" src="#bow" position="-8 0 -0.15" mixin="pino"></a-gltf-model>
                  <a-gltf-model class="pino" src="#bow" position="-7.7 0 0" mixin="pino"></a-gltf-model>
               </a-entity>
            </a-entity>
            <a-light type="spot" intensity="0.7" color="white" position="-8 3 -2" angle="75" 
              rotation="-90 0 0" penumbra="0.3" light="castShadow:true; shadowBias: -0.001;"></a-light>
            <a-light type="spot" intensity="0.7" color="white" position="0 3 -2" angle="75" 
              rotation="-90 0 0" penumbra="0.3" light="castShadow:true; shadowBias: -0.001;"></a-light>
            <a-light type="spot" intensity="0.7" color="white" position="8 3 -2" angle="75"  
              rotation="-90 0 0" penumbra="0.3" light="castShadow:true; shadowBias: -0.001;"></a-light>
            <a-light type="ambient" intensity="0.5" color="white"></a-light>
        </a-scene>
      </body>
    </html>
    
  • Cena com uma pista de boliche: teleporte, objetos GLTF, texturas e interação com os objetos.
    🔗 link da página

voltar ao topo

9. Realidade Aumentada

Material da página 145 até a página 154.

voltar ao topo

📃 Código do cabeçalho
Cabeçalho da página em RA de rastreamento de faces
<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <script src="https://cdn.jsdelivr.net/gh/hiukim/mind-ar-js@1.1.4/dist/mindar-face.prod.js"></script>
    <script src="https://aframe.io/releases/1.2.0/aframe.min.js"></script>
    <script src="https://cdn.jsdelivr.net/gh/hiukim/mind-ar-js@1.1.4/dist/mindar-face-aframe.prod.js"></script>
    <script>
      document.addEventListener("DOMContentLoaded", function() {
      const list = ["glasses1", "glasses2", "hat1", "hat2", "earring"];
      const visibles = [true, false, false, true, true];
      const setVisible = (button, entities, visible) => {
        if (visible) {
          button.classList.add("selected");
        } else {
          button.classList.remove("selected");
        }
      entities.forEach((entity) => {
        entity.setAttribute("visible", visible);
      });
    }
    list.forEach((item, index) => {
      const button = document.querySelector("#" + item);
      const entities = document.querySelectorAll("." + item + "-entity");
      setVisible(button, entities, visibles[index]);
      button.addEventListener('click', () => {
        visibles[index] = !visibles[index];
        setVisible(button, entities, visibles[index]);
      });
     });
    })
    </script>
    <style>
      body {margin: 0;}
      .example-container {overflow: hidden; position: absolute; width: 100%; height: 100%;}
      .options-panel {position: fixed; left: 0; top: 0; z-index: 2;}
      .options-panel img {border: solid 2px; width: 50px; height: 50px;	object-fit: cover;  
        cursor: pointer;}
      .options-panel img.selected {border-color: green;}
    </style>
  </head>

voltar ao topo

📃 Código do corpo da página
Corpo da página em RA de rastreamento de faces
  <body>
    <div class="example-container">
      <div class="options-panel">
        <img id="hat1" src="imagens/hat1.png">
        <img id="hat2" src="imagens/hat2.png">
        <img id="glasses1" src="imagens/glasses1.png">
        <img id="glasses2" src="imagens/glasses2.png">
        <img id="earring" src="imagens/earring.png"/>
      </div>
      <a-scene mindar-face embedded color-space="sRGB" renderer="colorManagement: true, physicallyCorrectLights" vr-mode-ui="enabled: false" device-orientation-permission-ui="enabled: false">
        <a-assets>
          <a-asset-item id="headModel" src="https://cdn.jsdelivr.net/gh/hiukim/mind-ar-js@1.1.4/examples/face-tracking/assets/sparkar/headOccluder.glb"></a-asset-item>
          <a-asset-item id="glassesModel" src="https://cdn.jsdelivr.net/gh/hiukim/mind-ar-js@1.1.4/examples/face-tracking/assets/glasses/scene.gltf"></a-asset-item>
          <a-asset-item id="glassesModel2" src="https://cdn.jsdelivr.net/gh/hiukim/mind-ar-js@1.1.4/examples/face-tracking/assets/glasses2/scene.gltf"></a-asset-item>
          <a-asset-item id="hatModel" src="https://cdn.jsdelivr.net/gh/hiukim/mind-ar-js@1.1.4/examples/face-tracking/assets/hat/scene.gltf"></a-asset-item>
          <a-asset-item id="hatModel2" src="https://cdn.jsdelivr.net/gh/hiukim/mind-ar-js@1.1.4/examples/face-tracking/assets/hat2/scene.gltf"></a-asset-item>
          <a-asset-item id="earringModel" src="https://cdn.jsdelivr.net/gh/hiukim/mind-ar-js@1.1.4/examples/face-tracking/assets/earring/scene.gltf"></a-asset-item>
        </a-assets>
        <a-camera position="0 0 0" active="false"  look-controls-enabled="false" rotation-reader 
          arjs-look-controls="smoothingFactor: 0.05"></a-camera>
        <a-entity mindar-face-target="anchorIndex: 168">
            <a-gltf-model mindar-face-occluder position="0 -0.3 0.15" rotation="0 0 0" 
              scale="0.065 0.065 0.065" src="#headModel"></a-gltf-model>
        </a-entity>
        <a-entity mindar-face-target="anchorIndex: 10">
            <a-gltf-model rotation="0 -0 0" position="0 1.0 -0.5" 
              scale="0.35 0.35 0.35" src="#hatModel" class="hat1-entity" visible="false"></a-gltf-model>
        </a-entity>
        <a-entity mindar-face-target="anchorIndex: 10">
            <a-gltf-model rotation="0 -0 0" position="0 -0.2 -0.5" 
              scale="0.008 0.008 0.008" src="#hatModel2" class="hat2-entity" visible="false"></a-gltf-model>
        </a-entity>
        <a-entity mindar-face-target="anchorIndex: 168">
            <a-gltf-model rotation="0 -0 0" position="0 0 0" 
              scale="0.01 0.01 0.01" src="#glassesModel" class="glasses1-entity" visible="false"></a-gltf-model>
        </a-entity>
        <a-entity mindar-face-target="anchorIndex: 168">
            <a-gltf-model rotation="0 -90 0" position="0 -0.3 0" 
              scale="0.6 0.6 0.6" src="#glassesModel2" class="glasses2-entity" visible="false"></a-gltf-model>
        </a-entity>
        <a-entity mindar-face-target="anchorIndex: 127">
            <a-gltf-model rotation="-0.1 -0 0" position="0 -0.3 -0.3" 
              scale="0.05 0.05 0.05" src="#earringModel" class="earring-entity" visible="false"></a-gltf-model>
        </a-entity>
        <a-entity mindar-face-target="anchorIndex: 356">
            <a-gltf-model rotation="0.1 -0 0" position="0 -0.3 -0.3" 
              scale="0.05 0.05 0.05" src="#earringModel" class="earring-entity" visible="false"></a-gltf-model>
        </a-entity>
      </a-scene>
    </div>
  </body>
</html>  

🔗 link da página

voltar ao topo

📃 Código
Código da página em RA baseada em localização
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
    <script src="https://unpkg.com/aframe-look-at-component@1.0.0/dist/aframe-look-at-component.min.js"></script>
    <script src="https://raw.githack.com/AR-js-org/AR.js/master/aframe/build/aframe-ar-nft.js"></script>
</head>

<body style="margin: 0px; overflow: hidden;">
    <a-scene vr-mode-ui="enabled: false" renderer="logarithmicDepthBuffer: true;" embedded arjs='sourceType: webcam; 
      debugUIEnabled: false;'>
        <a-assets>
            <a-asset-item id="modelo" src="objetos/helicoptero.glb"></a-asset-item>
            <a-asset-item id="modelo1" src="objetos/helicea.glb"></a-asset-item>
            <a-asset-item id="modelo2" src="objetos/heliceb.glb"></a-asset-item>
        </a-assets>

        <a-entity look-at="[gps-camera]" gps-entity-place="latitude: <DIGITE AQUI>; longitude: <DIGITE AQUI>;">
            <a-entity rotation="0 120 0" scale="0.5 0.5 0.5" position="2 0 -4"> 
                <a-gltf-model src="#modelo"></a-gltf-model>
                <a-entity position="0 0 0">
                    <a-gltf-model src="#modelo1" animation="property: rotation; to: 0 360 0; 
                      loop: true; dur: 4000; easing: linear"></a-gltf-model>
                </a-entity>
                <a-entity position="0.037 1.947 5.267" rotation="10 0 0">
                    <a-gltf-model src="#modelo2" animation="property: rotation; to: 360 0 0; 
                      loop: true; dur: 3200; easing: linear"></a-gltf-model>
                </a-entity>
            </a-entity>
        </a-entity>
		
        <a-camera gps-camera rotation-reader active="false" position="0 0 0" 
          look-controls-enabled="false"></a-camera>
        <a-light type="ambient" color="white" intensity="2"></a-light>
        <a-light type="directional" color="white" intensity="1.5" position="-1 1 1"></a-light>
        <a-light type="directional" color="white" intensity="1.5" position="1 1 1"></a-light>
    </a-scene>
</body>
</html>

🔗 link da página do helicóptero em RV

voltar ao topo

🔗 Link

Padrões de QR codes 3x3 e 4x4: https://github.com/artoolkit/ARToolKit5/tree/master/doc/patterns

voltar ao topo

📃 Código
Código da página em RA baseada em marcadores QR codes impressos
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <script src="https://aframe.io/releases/1.2.0/aframe.min.js"></script>
    <script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"></script>
    <script src="https://cdn.jsdelivr.net/gh/donmccurdy/aframe-extras@v6.1.1/dist/aframe-extras.min.js"></script>
</head>

<body style="margin: 0px; overflow: hidden;">
    <a-scene embedded renderer="logarithmicDepthBuffer: true;" arjs='sourceType: webcam; trackingMethod: best; 
      detectionMode: mono_and_matrix; matrixCodeType: 3x3; debugUIEnabled: false;'>
        <a-assets>
            <a-asset-item id="modelo" src="objetos/helicoptero.glb"></a-asset-item>
            <a-asset-item id="modelo1" src="objetos/helicea.glb"></a-asset-item>
            <a-asset-item id="modelo2" src="objetos/heliceb.glb"></a-asset-item>
            <a-asset-item id="modelo3" src="objetos/lamp2/scene.gltf"></a-asset-item>
            <a-asset-item id="modelo4" src="objetos/evening/scene.gltf"></a-asset-item>
        </a-assets>

        <a-marker preset="hiro">
            <a-entity scale="0.5 0.5 0.5" position="0 0.5 0">
                <a-gltf-model src="#modelo"></a-gltf-model>
                <a-entity position="0 0 0">
                    <a-gltf-model src="#modelo1" animation="property: rotation; to: 0 360 0; 
                      loop: true; dur: 4000; easing: linear"></a-gltf-model>
                </a-entity>
                <a-entity position="0.037 1.947 5.267" rotation="10 0 0">
                    <a-gltf-model src="#modelo2" animation="property: rotation; to: 360 0 0; 
                      loop: true; dur: 3200; easing: linear"></a-gltf-model>
                </a-entity>
            </a-entity>
        </a-marker>
		
        <a-marker type="barcode" value="20">
            <a-entity scale="0.5 0.5 0.5" position="0 0.05 0">
                <a-gltf-model src="#modelo3"></a-gltf-model>
            </a-entity>
        </a-marker>
		
        <a-marker type="barcode" value="17">
            <a-entity position="1.5 0.05 -2">
                <a-entity position="0 1 0" animation="property:rotation; to:0 360 0; dur:8000; 
                  easing:linear; loop:true">
                    <a-octahedron color="orange" radius="1" opacity="0.8"></a-octahedron>
                    <a-octahedron color="grey" radius="1" wireframe="true"></a-octahedron>
                </a-entity>
                <a-box position="0 1 0" scale="2 2 2" color="blue" opacity="0.6"></a-box>
                <a-text position="-1 0 2" rotation="-90 0 0" text="width:6; side:double; color:black"
                  value="Octaedro em RA"></a-text>
            </a-entity>
        </a-marker>
		
        <a-marker type="barcode" value="10">
            <a-entity scale="0.01 0.01 0.01" position="0 0.05 0">
                <a-gltf-model src="#modelo4" animation-mixer></a-gltf-model>
            </a-entity>
        </a-marker>
		
        <a-entity camera></a-entity>
        <a-light type="ambient" color="white" intensity="1"></a-light>
        <a-light type="directional" color="white" intensity="1.5" position="-1 1 1"></a-light>
        <a-light type="directional" color="white" intensity="1.5" position="1 1 1"></a-light>
    </a-scene>
</body>
</html>

🔗 link da página

voltar ao topo

voltar ao topo


voltar ao topo

voltar ao topo

página desenvolvida por:

Paulo Henrique Siqueira

contato: paulohscwb@gmail.com

O desenvolvimento deste material faz parte do Grupo de Estudos em Expressão Gráfica (GEEGRAF) da Universidade Federal do Paraná (UFPR)

Licença Creative Commons
Visualização Científica de Paulo Henrique Siqueira está licenciado com uma Licença Creative Commons Atribuição-NãoComercial-SemDerivações 4.0 Internacional.

Como citar este trabalho:

Siqueira, P.H., "Visualização Científica". Disponível em: <https://paulohscwb.github.io/visualizacao-cientifica/>, Agosto de 2022.


DOI

Referências:

  1. A-frame. A web framework for building 3D/AR/VR experiences. Disponível em: <https://aframe.io/>, 2022.
  2. Anscombe, F. J. Graphs in Statistical Analysis. American Statistician, vol. 27, n. 1, p. 17–21, 1973.
  3. Card, S. K., Mackinlay, J. D., Shneiderman, B. Readings in Information Visualization Using Vision to Think. San Francisco: Browse books, 1999.
  4. Eler, D. M. Visualização de Informação. Disponível em: <https://daniloeler.github.io/teaching/VISUALIZACAO>, 2020.
  5. Horst, A. M., Hill, A. P., Gorman, K. B. Palmerpenguins: Palmer Archipelago (Antarctica) penguin data. Disponível em: <https://allisonhorst.github.io/palmerpenguins/>. doi: 10.5281/zenodo.3960218, 2020.
  6. Keim, D. A. Information Visualization and Visual Data Mining. IEEE Transactions on Visualization and Computer Graphics, vol. 8, n. 1, p. 1–8, 2002.
  7. Keller, P. R, Keller, M. M. Visual Cues: Pratical Data Visualization. Los Alamitos, CA: IEEE Computer Society Press, 1994.
  8. Moro, C. et al. The effectiveness of virtual and augmented reality in health sciences and medical anatomy. Anatomical sciences education, v. 10, n. 6, p. 549–559, 2017.
  9. Siqueira, P. H. Desenvolvimento de ambientes web em Realidade Aumentada e Realidade Virtual para estudos de superfícies topográficas. Revista Brasileira de Expressão Gráfica, v. 7, n. 2, p. 21–44, 2019.
  10. Shneiderman, B. The eyes have it: a task by data type taxonomy for information visualization. In: Proceedings of the 1996, IEEE Symposium on Visual Languages, p. 336–343. Washington, DC: IEEE Computer Society, 1996.
  11. Telea, A. C. Data visualization: principles and practice. Boca Raton: CRC Press, 2015.
  12. Ward, M., Grinstein, G.G., Keim, D. Interactive data visualization foundations, techniques, and applications. Massachusetts: A K Peters, 2010.
  13. Williams, J. G., Sochats, K. M., Morse, E. Visualization. Annual Review of Information Science and Technology (ARIST), v. 30, p. 161–207, 1995.