# Câmara

Como criador, você pode ter controle total sobre a câmera do jogador. Por padrão, os jogadores são livres para escolher entre um modo de câmera em 1ª ou 3ª pessoa enquanto exploram sua scene, mas você pode impor uma modalidade de câmera diferente.

As câmeras virtuais podem ser estáticas, podem girar para sempre olhar para o jogador ou alguma outra entity, ou podem ser anexadas ao jogador ou a alguma outra entity para que estejam sempre acompanhando.

{% hint style="warning" %}
**📔 Nota**: Para alternar entre as câmeras padrão em 1ª e 3ª pessoa, veja [Áreas de modificação da câmera](#1st-and-3rd-person-camera-modes).
{% endhint %}

## Modos de câmera em 1ª e 3ª pessoa

Normalmente, os jogadores são livres para alternar entre a câmera em primeira e terceira pessoa pressionando V no teclado. Use uma `CameraModeArea` para forçar o modo de câmera para 1ª ou 3ª pessoa para todos os jogadores que estiverem dentro de uma área específica em sua scene.

```ts
const entity = engine.addEntity()

CameraModeArea.create(entity, {
	area: Vector3.create(4, 3, 4),
	mode: CameraType.CT_FIRST_PERSON,
})
```

Se o modo de câmera atual de um jogador não corresponder ao da `CameraModeArea`, ele será انتقالado para esse modo de câmera. Um toast aparece na tela para esclarecer que essa mudança se deve à scene. Enquanto estiverem dentro, os jogadores não podem alterar o modo de câmera. Quando um jogador sair da `CameraModeArea`, seu modo de câmera será restaurado para o que ele tinha antes de entrar.

Use `CameraModeArea` em regiões onde os jogadores teriam uma experiência significativamente melhor usando um modo de câmera específico. Por exemplo, a primeira pessoa é ideal se o jogador precisar clicar em um objeto pequeno, ou a terceira pessoa pode ser útil para os jogadores perceberem alguma entity que sua scene tenha anexado sobre a cabeça deles. Não assuma que os jogadores sabem como alternar os modos de câmera; muitos jogadores de primeira viagem podem não saber que têm essa opção, ou não se lembrar da tecla para fazer isso.

{% hint style="warning" %}
**📔 Nota**: As áreas de modificação da câmera são afetadas pelo *position* e *rotation* do component Transform da entity anfitriã, mas não são afetadas pelo *scale*.
{% endhint %}

{% hint style="warning" %}
**📔 Nota**: Se você sobrepor várias áreas de modificação da câmera, a última a ser instanciada pelo código da sua scene terá prioridade sobre as outras.
{% endhint %}

Ao criar um `CameraModeArea` component, tem de fornecer o seguinte:

* `area`: Tamanho da área do modifier
* `cameraMode`: Qual modo de câmera forçar nesta área, a partir do `CameraType` enum.

Os modos de câmera suportados são:

* `CameraType.CT_FIRST_PERSON`
* `CameraType.CT_THIRD_PERSON`

### Consultar o modo de câmera

Você pode consultar o modo de câmera do jogador usando o `CameraMode` component no `engine.CameraEntity`.

```ts
const cameraMode = CameraMode.get(engine.CameraEntity)
if (cameraMode.mode === CameraType.CT_FIRST_PERSON) {
	console.log('O jogador está usando a câmera em 1ª pessoa')
} else {
	console.log('O jogador está usando a câmera em 3ª pessoa')
}
```

Você também pode se inscrever para alterações no modo de câmera usando o `onChange` função no `CameraMode` component.

```ts
CameraMode.onChange(engine.CameraEntity, (cameraMode) => {
	if (!cameraMode) return
	console.log('O modo de câmera do jogador mudou para', cameraMode.mode)
})
```

## Usando câmeras virtuais

Para usar um comportamento de câmera personalizado em sua scene, você precisa de duas coisas:

* Criar uma Virtual Camera: Crie uma entity em sua scene e atribua a ela um `VirtualCamera`.
* Atribuir essa câmera virtual: Adicione uma `MainCamera` component ao [reserved entity](/creator/content-creator-pt/scenes-sdk7/arquitetura/entities-components.md#reserved-entities) `engine.CameraEntity`, com uma referência à entity com o `VirtualCamera` component.

A câmera será então anexada à entity com o `VirtualCamera` component. Se a entity se mover ou girar, a câmera se moverá com ela.

```ts
function main() {
	const myCustomCamera = engine.addEntity()
	Transform.create(myCustomCamera, {
		position: Vector3.create(1, 2, 1),
	})
	VirtualCamera.create(myCustomCamera, {})

	const mainCamera = MainCamera.createOrReplace(engine.CameraEntity, {
		virtualCameraEntity: myCustomCamera,
	})
}
```

Neste exemplo, a câmera estará sempre em uma posição fixa na scene, contanto que o jogador permaneça dentro dos limites da scene. Assim que o jogador sair dos limites da scene, o comportamento padrão da câmera será restaurado.

Sua scene pode incluir quantas entities com um `VirtualCamera`component você quiser e alternar dinamicamente entre várias câmeras virtuais conforme o jogador se move, ou conforme realiza certas ações. Apenas uma câmera virtual fica ativa em um dado momento; isso é atribuído pelo `MainCamera` component em `engine.CameraEntity`.

Para voltar ao comportamento padrão da câmera, defina o valor de `undefined` em `MainCamera.virtualCameraEntity`. O jogador então fica livre para alternar entre as câmeras em 1ª e 3ª pessoa. Se você quiser que o jogador use apenas um desses dois modos, pode usar uma [Áreas de modificação da câmera](#1st-and-3rd-person-camera-modes) para forçar um dos dois.

{% hint style="warning" %}
**📔 Nota**: As áreas de modificação da câmera só têm efeito no jogador se não houver câmeras virtuais ativas. Se a scene estiver usando uma câmera virtual no momento e o jogador entrar em uma área de modificação da câmera, nada acontece.

Se um modelo 3D incluir um `camera` node como parte de seu conteúdo, isso não pode ser usado pelo SDK. Você deve criar todas as câmeras como entities com o SDK.
{% endhint %}

```ts
function main() {
	// câmera virtual personalizada
	const myCustomCamera = engine.addEntity()
	Transform.create(myCustomCamera, {
		position: Vector3.create(1, 2, 1),
	})
	VirtualCamera.create(myCustomCamera, {})

	const mainCamera = MainCamera.createOrReplace(engine.CameraEntity, {
		virtualCameraEntity: myCustomCamera,
	})

	// cubo clicável
	const clickCube = engine.addEntity()
	Transform.create(clickCube, { position: Vector3.create(8, 0, 8) })
	MeshRenderer.setBox(clickCube)
	MeshCollider.setBox(clickCube)
	pointerEventsSystem.onPointerDown(
		{
			entity: clickCube,
			opts: { button: InputAction.IA_POINTER, hoverText: 'Redefinir câmera' },
		},
		() => {
			// redefinir a câmera para o comportamento padrão
			const mainCamera = MainCamera.getMutable(engine.CameraEntity)
			mainCamera.virtualCameraEntity = undefined
		}
	)
}
```

{% hint style="info" %}
**💡 Dica**: Quando a câmera se afasta do avatar, geralmente também é uma boa prática congelar os movimentos do avatar. Dessa forma, o jogador não se move às cegas para dentro de obstáculos. Veja [Input Modifiers](/creator/content-creator-pt/scenes-sdk7/interatividade/player-avatar.md#freeze-the-player)
{% endhint %}

## Vista aérea

Você pode usar uma câmera virtual para ver a scene de uma visão de cima, o que pode ser uma variação divertida da perspectiva normal do seu avatar e permitir mecânicas de jogo diferentes.

Você deve evitar posicionar uma câmera olhando em uma direção perfeitamente vertical para baixo. Em vez disso, incline sempre a câmera um pouco; até 1 grau é suficiente. Isso ocorre porque os controles de direção do jogador são baseados na perspectiva da câmera, não na orientação do avatar. Se a câmera estiver olhando de uma vista aérea perfeita, não há uma definição clara de qual direção é qual. Uma inclinação imperceptível de 1 grau é suficiente para estabelecer uma direção para frente.

```ts
function main() {
	// câmera de vista aérea
	const myCustomCamera = engine.addEntity()
	Transform.create(myCustomCamera, {
		position: Vector3.create(8, 5, 8),
		rotation: Quaternion.Euler(0, 0, 91) 
		// Observe que a rotação é 91º, não 90º
	})
	VirtualCamera.create(myCustomCamera, {})

	const mainCamera = MainCamera.createOrReplace(engine.CameraEntity, {
		virtualCameraEntity: myCustomCamera,
	})
}
```

## Transições de câmera

Sempre que a scene alterna entre câmeras virtuais, ou entre o comportamento padrão da câmera e câmeras virtuais, os jogadores veem uma transição. A posição, a rotação e quaisquer outros parâmetros da câmera virtual mudam suavemente ao longo de um período de tempo.

As configurações de transição em uma câmera virtual determinam como você faz a transição *para* essa câmera, a partir de qualquer outra câmera na scene, incluindo a padrão. Elas não afetam como você faz a transição *para fora* dessa câmera.

```ts
VirtualCamera.create(myCustomCamera1, {
	defaultTransition: { transitionMode: VirtualCamera.Transition.Time(6) },
})
```

{% hint style="info" %}
**💡 Dica**: Para evitar uma transição e alternar instantaneamente para uma câmera, defina o tempo ou a velocidade de transição como 0.
{% endhint %}

Dependendo do seu caso de uso, você pode preferir definir a velocidade da transição em vez da duração:

* **Tempo fixo**: Você define a duração da transição; a câmera se moverá o mais rápido que precisar para completar o percurso dentro desse período de tempo.
* **Velocidade fixa**: Você define quão rápido quer que a câmera virtual se mova durante a transição; a duração dependerá da distância. O valor usado para a velocidade é interpretado como **metros por segundo**.

Abaixo estão exemplos para ambos esses modos de transição:

```ts
// duração fixa
VirtualCamera.create(myCustomCamera1, {
	defaultTransition: { transitionMode: VirtualCamera.Transition.Time(6) },
})

// velocidade fixa
VirtualCamera.create(myCustomCamera1, {
	defaultTransition: { transitionMode: VirtualCamera.Transition.Speed(3) },
})
```

Abaixo está um exemplo completo com duas câmeras virtuais e transições entre elas:

```ts
function main() {
	// câmera virtual personalizada 1
	const myCustomCamera1 = engine.addEntity()
	Transform.create(myCustomCamera1, {
		position: Vector3.create(1, 2, 1),
	})
	VirtualCamera.create(myCustomCamera1, {
		defaultTransition: { transitionMode: VirtualCamera.Transition.Time(1) },
	})

	// câmera virtual personalizada 2
	const myCustomCamera2 = engine.addEntity()
	Transform.create(myCustomCamera2, {
		position: Vector3.create(1, 2, 1),
	})
	VirtualCamera.create(myCustomCamera2, {
		defaultTransition: { transitionMode: VirtualCamera.Transition.Time(3) },
	})

	const mainCamera = MainCamera.createOrReplace(engine.CameraEntity, {
		virtualCameraEntity: myCustomCamera,
	})

	// cubo clicável
	const clickCube = engine.addEntity()
	Transform.create(clickCube, { position: Vector3.create(8, 0, 8) })
	MeshRenderer.setBox(clickCube)
	MeshCollider.setBox(clickCube)
	pointerEventsSystem.onPointerDown(
		{
			entity: clickCube,
			opts: { button: InputAction.IA_POINTER, hoverText: 'Redefinir câmera' },
		},
		() => {
			// redefinir a câmera para o comportamento padrão
			const mainCamera = MainCamera.getMutable(engine.CameraEntity)
			mainCamera.virtualCameraEntity =
				mainCamera.virtualCameraEntity == myCustomCamera1
					? myCustomCamera2
					: myCustomCamera1
		}
	)
}
```

As transições sempre se movem em linha reta, sem considerar quaisquer obstáculos no caminho. Em vez disso, você poderia criar uma transição manualmente usando outra câmera virtual como intermediária; dessa forma, você teria controle total sobre seus movimentos. Essa câmera virtual intermediária poderia realizar uma [Tween](/creator/content-creator-pt/scenes-sdk7/essenciais-de-conteudo-3d/move-entities.md#move-between-two-points) da posição da primeira câmera até a posição da segunda câmera, ou seguir um caminho mais personalizado que evite obstáculos ou faça um desvio cinematográfico.

## Seguir a câmera

Você pode configurar uma câmera virtual para que ela sempre fique voltada para a direção do jogador, ou de alguma entity específica na scene. A posição da câmera permanecerá estática, mas sua rotação mudará para manter essa entity sempre centralizada.

Isso pode ser feito com o `lookAtEntity` propriedade no `VirtualCamera` component. Para seguir o jogador, use o [reserved entity](/creator/content-creator-pt/scenes-sdk7/arquitetura/entities-components.md#reserved-entities) `engine.PlayerEntity`.

```ts
const myCustomCamera1 = engine.addEntity()
Transform.create(myCustomCamera1, {
	position: Vector3.create(1, 2, 1),
})
VirtualCamera.create(myCustomCamera1, {
	lookAtEntity: engine.PlayerEntity,
})
```

Se uma entity estiver sendo seguida pela câmera, isso mudará apenas a rotação, não a posição da câmera.

À medida que a câmera gira, o Transform da entity com o `VirtualCamera` component não muda. No entanto, você pode ler a rotação da câmera a partir do Transform em `engine.CameraEntity`. A rotação e a posição dessa entity serão absolutas; elas não serão condicionadas pelas da entity com o `VirtualCamera` component. A rotação desse transform é afetada pelo comportamento de `lookAtEntity` .

{% hint style="warning" %}
**📔 Nota**: Se você configurar a câmera virtual com um `lookAtEntity` que faça referência à mesma entity que contém a câmera virtual, ou à entity `engine.MainCamera` , o comportamento resultante será o mesmo que não atribuir nenhuma entity.
{% endhint %}

## Anexar ao jogador

Outro uso da câmera virtual é seguir o jogador a partir de uma distância ou ângulo personalizados, anexando uma câmera virtual à entity do jogador. Observe que o jogador não pode alterar livremente a rotação da câmera, então, nesse caso, a rotação da câmera ficará fixa à da câmera virtual. Isso pode ser útil, por exemplo, para jogos de corrida, em que se espera que o jogador esteja sempre olhando para frente.

```ts
function main() {
	const myCustomCamera = engine.addEntity()
	Transform.create(myCustomCamera, {
		position: Vector3.create(0, 1, 5),
		parent: engine.PlayerEntity,
	})
	VirtualCamera.create(myCustomCamera, {
		defaultTransition: { transitionMode: VirtualCamera.Transition.Time(2) },
	})

	const mainCamera = MainCamera.createOrReplace(engine.CameraEntity, {
		virtualCameraEntity: myCustomCamera,
	})
}
```

## Cameras e colliders

Quando a câmera de um jogador se move no modo de terceira pessoa, a câmera pode ou não ser bloqueada por colliders, dependendo das collision layers atribuídas às entities. Tenha isso em mente ao projetar sua scene; talvez você queira impedir que a câmera atravesse paredes ou outras entities.

Consulte [Colliders](/creator/content-creator-pt/scenes-sdk7/essenciais-de-conteudo-3d/colliders.md#cameras-and-colliders) para mais detalhes sobre como configurar colliders para sua scene.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/essenciais-de-conteudo-3d/camera.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
