"Weiche" Außenkamera

Eure Foren für alle Diskussionen rund ums Thema Modding.
TheLion092
Posts: 7
Joined: Sun Aug 18, 2013 5:53 pm

"Weiche" Außenkamera

Post by TheLion092 »

Vorab, ich habe im Jahr 2013 mal einen ähnlichen Artikel geschrieben, allerdings konnte mal damals keiner so richtig weiterhelfen aber mittlerweile ist die Engine von Giants fortschrittlicher geworden und vielleicht findet sich jetzt jemand.

Es geht um folgendes Problem bzw. Wunsch. Ich möchte eine Außenkamera haben, die sich auf der Y Achse, d.h. die horizontale Drehrichtung, nicht instand mit dem Fahrzeug mitbewegt sondern langsam hinterherwandert, ähnlich anderen Videospielen wie GTA. Ich habe bereits ein Script gefunden (freeCamera) http://www.modsls17.com/free-camera-for-ls-17 welche die Außenkamera komplett vom Fahrzeug entkoppelt. Das ist zumindest schonmal ein Schritt in die richtige Richtung was ich haben will. Man müsste das Scipt jetzt nur noch so umschreiben, dass die Kamera sich (vielleicht mittels eines Timers und einer Exponentialfunktion oder der Fahrzeuggeschwindigkeit ?) langsam hinter das Fahrzeug dreht.


Dazu habe ich mir das Script von freeCamera mal genauer angeguckt und zitiere es hier mal:

Code: Select all

print("////////////////// FreeCamera mod (by HarvesteR) ///////////////////")

cameras = {}

VehicleCamera.updateRotateNodeRotation = function(self)

	local rotY = self.rotY;
	if self.rotYSteeringRotSpeed ~= 0 and self.vehicle.rotatedTime ~= nil then
		rotY = rotY + self.vehicle.rotatedTime*self.rotYSteeringRotSpeed;
	end

	
	if getUpdatedToggles(self) then
		local upx,upy,upz = 0,1,0;

		local dx,dy,dz = 0,0,1; --localDirectionToWorld(getParent(self.rotateNode), 0,0,1);
		local invLen = 1/math.sqrt(dx*dx + dz*dz);
		dx = dx*invLen;
		dz = dz*invLen;

		local newDx = math.cos(self.rotX) * (math.cos(rotY)*dx + math.sin(rotY)*dz);
		local newDy = -math.sin(self.rotX);
		local newDz = math.cos(self.rotX) * (-math.sin(rotY)*dx + math.cos(rotY)*dz);

		newDx,newDy,newDz = worldDirectionToLocal(getParent(self.rotateNode), newDx,newDy,newDz);
		upx,upy,upz = worldDirectionToLocal(getParent(self.rotateNode), upx,upy,upz);

		setDirection(self.rotateNode, newDx,newDy,newDz, upx,upy,upz);
	else
		if self.useWorldXZRotation then
			
			local upx,upy,upz = 0,1,0;

			local dx,dy,dz = localDirectionToWorld(getParent(self.rotateNode), 0,0,1);
			local invLen = 1/math.sqrt(dx*dx + dz*dz);
			dx = dx*invLen;
			dz = dz*invLen;

			local newDx = math.cos(self.rotX) * (math.cos(rotY)*dx + math.sin(rotY)*dz);
			local newDy = -math.sin(self.rotX);
			local newDz = math.cos(self.rotX) * (-math.sin(rotY)*dx + math.cos(rotY)*dz);

			newDx,newDy,newDz = worldDirectionToLocal(getParent(self.rotateNode), newDx,newDy,newDz);
			upx,upy,upz = worldDirectionToLocal(getParent(self.rotateNode), upx,upy,upz);

			setDirection(self.rotateNode, newDx,newDy,newDz, upx,upy,upz);
			
			
		else
			setRotation(self.rotateNode, self.rotX, rotY, self.rotZ);
		end;
	end;
end;

function getUpdatedToggles(cam)	
	
		if cameras[cam] == nil then
			cameras[cam] = false
		end;
	
		if InputBinding.hasEvent(InputBinding.cameraFrameOfReference) then	
			cameras[cam] = not cameras[cam];	
		end;
		
		return cameras[cam];	
end;
Mir ist dabei aufgefallen, dass hier größtenteils die API von Giants selber https://gdn.giants-software.com/documen ... ation48015 benutzt wird.
Meiner Meinung nach müsste es doch nun möglich sein hier mit den richtigen mathematischen Formeln etwas machen zu können.
Ich bin jetzt nicht komplett unerfahren was Programmierung angeht, bin Fachinformatiker und habe immer wieder mal Kontakt mit verschiedenen Sprachen.
In LUA arbeite ich mich seit ein paar Tagen grade ein.

Hat eventuell jemand eine Idee an welcher Stelle im Script ich ansetzen muss und am Besten noch wie ?

Liebe Grüße
TheLion092