Cámara orbital primeros pasos

publicado en: Codificación, Desarrollo, Uncategorized | 0

La cámara orbital es una cámara que orbita al rededor del personaje y lo sigue en todo momento. Esta cámara se ha logrado conseguir usando la malla del jugador como referencia, donde se posiciona en el hueso de la cabeza un pivote que no es visible, y sigue la malla en todo momento.

El pivote antes mencionado es hijo de otro pivote que lo sigue ha cierta distancia y es el que marca la posición de la cámara. Para lo anterior se establece una clase denominada CPlayer que establece el método necesario para que todo esto funcione como se espera.

-- ************************************************
-- ** Fichero 	: Player.lua
-- ** Tipo		: Clase CPlayer.
-- ** Scripter  : Yue Rexie.
-- ** Web		: https://www.iris3dgames.xyz
-- ** Proyecto	: Astrocuco.
-- ************************************************

CPlayer={}
	function Player:Create(meshPlayer, pivotPlayer, cameraPlayer, pivotCamera)
		local this={}
		
		this.player 		= nil
		this.pivotP  		= nil
		this.camera 		= nil
		this.pivotC 		= nil
		

        this.window = Window:GetCurrent()
		
		
		function this:New(meshPlayer, pivotPlayer, cameraPlayer, pivotCamera  )
			
			self.player 		= meshPlayer 					-- Malla Jugador.
			self.pivotP  		= pivotPlayer 					-- Pivote Player.
			
			self.camera  		= cameraPlayer					-- Cámara Player.
			self.camera:SetRange(0.01,1000)						-- Rango Cámara.

			self.pivotC  		= pivotCamera		 			-- Pivote Cámara.
			self.pivotC:SetParent(self.pivotP,true)				-- Padre de Pivote C.
	
			-- Player no colisiona con ningún rayo.
			self.player:SetPickMode(0)

			self.pivotP:SetPosition(self.player:FindChild("mixamorig:Head"):GetPosition(true))
			System:Print("Start Constructor Objetc Player.. OK!")
		
		end
		this:New(meshPlayer, pivotPlayer, cameraPlayer, pivotCamera)

		function this:Update()

			self:UpdateCamera()
			
		end
	
		-- Cámara Orbital.
		function this:UpdateCamera()
			
			self.sx = Math:Round(Context:GetCurrent():GetWidth()/2)
			self.sy = Math:Round(Context:GetCurrent():GetHeight()/2)

			self.posMouse = Window:GetCurrent():GetMousePosition()
			self.window:SetMousePosition( self.sx, self.sy )
				
			self.dx = self.posMouse.x - self.sx 
			self.dy = self.posMouse.y - self.sy
			
			self.rotation= self.pivotP:GetRotation()
			
			--55

			self.rotation.y = self.rotation.y + self.dx /  50.0 / Time:GetSpeed() 
			self.rotation.x = self.rotation.x + self.dy /  50.0 / Time:GetSpeed()

			self.pivotP:SetRotation(self.rotation, true )

			self.camera:SetPosition(self.pivotC:GetPosition(true))
			self.camera:SetRotation(self.pivotP:GetRotation(true))
			--self.pivotP:SetPosition(self.player:GetPosition(true))
			self.pivotP:SetPosition(self.player:FindChild("mixamorig:Head"):GetPosition(true))
		end
		
		System:Print("Create Object Player... Ok!")
		return this
	end

El resultado de todo esto, es que al mover el ratón de la computadora, el pivote que se posiciona en el hueso de la cabeza de la malla del jugador es girado tanto en su eje Y como en su eje Z, y la cámara que se posiciona en el segundo pivote a cierta distancia gira de acuerdo al giro del eje posicionado en la cabeza. El segundo pivote lo que hace es marcar la posición de la cámara para mantenerse a cierta distancia del jugador.

Cámara orbital Jugador

El resultado es el esperado para un juego en tercera persona donde se visualiza el personaje y sus respectivos movimientos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *