# J2ME/Lições/M3G/Criando objetos primitivos

Além de poder carregar objetos externos você também pode criar objetos primitivos usando os recursos do próprio M3G.

## Criando uma câmera

Apesar do arquivo .m3g ter a facilidade de se poder criar a própria câmera, ela pode apresentar alguns tipos de dificuldade em relação ao aspecto de tela de cada celular, que pode deixar o gráfico exibido no celular "esticado" tanto horizontalmente quanto verticalmente. Para resolver isso é recomendável criar uma própria câmera definindo os aspectos de cada celular.
Para fazer isso crie um arquivo .m3g em algum editor externo, mas lembre-se de NÃO colocar uma câmera no arquivo, já que essa nós vamos criar manualmente. Com o arquivo criado vamos carrega-lo normalmente como fizemos anteriomente, adicionar no objeto World, e renderiza-lo normalmente.
Agora, como vamos manipular a câmera manualmente vamos criar um objeto do tipo Camera.
Agora dentro do construtor vamos inicializar a câmera.
Agora vamos usar o método setPerspective para ajustar os atributos da câmera, o primeiro atributo será o ângulo de visão em graus (60 é a angulação padrão), o próximo campo será o aspecto da tela que será a largura da tela dividida pela autura, o terceiro campo é a distância em que a cena começará a ser renderizada (deve ser obrigatoriamente maior que zero), e por último é a distância máxima da renderização (o horizonte).
Agora vamos adicionar o nosso objeto do tipo Camera para o mundo 3D, para isso vamos usar o método addChild e entrar a nossa câmera como parâmetro.
Por último agora que adicionamos a câmera ao mundo 3D, vamos dizer ao mundo 3D que queremos que essa câmera seja a câmera ativa, através do método setActiveCamera entrando como parâmetro o nome da câmera.

## Criando um triângulo

Vamos começar criando o mais simples dos polígonos, o triângulo, primeiramente na nossa classe vamos colocar o que aprendemos anteriormente.

### VertexArray

O objeto do tipo VertexArray (array de vértices) é o tipo de objeto genérico que pode guardar coisas como a posição dos vértices, normais, texturas, etc...

#### Vértices

Primeiramente vamos criar um array do tipo short que irá armazenar os vértices X, Y e Z (nessa ordem) do nosso triângulo.
Sabemos que o VertexArray pode guardar coisas como a posição dos vértices, normais, texturas, etc... no nosso caso iremos criar um objeto para armazenar a posição dos vértices. Como parâmetros do construtor iremos entrar:
* O número de vértices do VertexArray (como faremos um triângulo então teremos 3 vértices)
* O número de componentes por vértice (nesse caso são 3, os eixos X, Y e Z).
* O tamanho em bytes de cada componente (nesse caso 2, pois um short ocupa 2 bytes). OBS: O tamanho máximo é 2.
Criamos o array dos vértices e criamos também o objeto do tipo VertexArray. Agora iremos colocar o array vetorVertices que criamos dentro do objeto VertexArray para isso iremos usar o método set onde iremos entrar 3 parâmetros:
* O primeiro vértice do vetor vertices (nesse caso e quase sempre será zero)
* O número de vértices do VertexArray (como faremos um triângulo então teremos 3 vértices).
* O vetor de vértices (o que criamos short vertices).

#### Normais

A exemplo do anterior primeiramente criamos um array do tipo short que agora irá armazenar a posição das noemais de cada vértice (127-padrão, 0-sem normal, -127-invertido) nesse caso como fizemos um triângulo plano vamos setar a normal padrão para o eixo Y (virado para cima).
Agora vamos criar o objeto VertexArray com os mesmos atributos no construtor (número de vertices do VextexArray, o numero de componentes de cada vértice, o tamanho em bytes de cada componente).
E por fim, chamar novamente o método set com os mesmos atributos (índice do primeiro vértice, o numero de vértice do VertexArray, o vetor de vértices).

#### Textura*

Por último vamos agora criar um vetor para as texturas.
Vamos também criar o objeto do tipo VextexArray utilizando os mesmos atributos anteriores (número de vertices do VextexArray, o numero de componentes de cada vértice, o tamanho em bytes de cada componente).
E por fim chamamos o método set com os mesmos atributos (índice do primeiro vértice, o numero de vértice do VertexArray, o vetor de vértices).

### Vertex buffer*

Criamos os arrays dos vértices, das normais e das texturas, agora precisamos agrupar esses arrays em um único buffer, por isso agora iremos criar um objeto do tipo VertexBuffer.
Agora para colocar o array de posições que criamos anteriormente vamos usar o método setPositions da classe VertexBuffer, como parâmetros entraremos o objeto VertexArray, a escala (tamanho) do objeto e por fim o parâmetro null.