Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  4 1244
Jeg holder på å lage et script som attaches til hovedkamera, slik at det blant annet skal kunne gi ortografisk- og persketiv-projeksjon. Siden det ikke er mulig å endre kameraet sine matriser direkte, genereres matrisene for så å tilordnes kameraet, slik:

Kode

         Camera camera = GetComponent<Camera>();
	 camera.projectionMatrix = CreateM();
	 camera.worldToCameraMatrix = CreateWorldCam();
Den ortografiske delen er jo veldig rett frem, med kameramatrisen M


http://s4.postimg.org/kzrcnkcex/orthomatrise.jpg

Kode

	Matrix4x4 CreateOrtho()
	{
		Matrix4x4 M_orth = new Matrix4x4();
		
		M_orth[0,0] = 2/(r-l); 
		M_orth[0,3] = -((r+l)/(r-l)); 
		
		M_orth[1,1] = 2/(t-b); 
		M_orth[1,3] = -((t+b)/(t-b)); 
		
		M_orth[2,2] = 2/(n-f); 
		M_orth[2,3] = -((n+f)/(n-f));
		
		M_orth[3,3] = 1; 
		
		return M_orth;
	}
Den neste er der problemet oppstår, eller under der igjen. Dette er mye samme (helt samme?) som OpenGL.,

http://s13.postimg.org/ywkpjlonn/Open_GL.jpg

Kode

	

Matrix4x4 CreatePerspective()
	{
		Matrix4x4 M_per = new Matrix4x4();
		M_per[0, 0] = (2.0F * n) / (r - l);
		M_per[0, 2] = (r + l) / (l-r);
		M_per[1, 1] = (2.0F * n) / (t - b);
		M_per[1, 2] = (t + b) / (b-t);
		M_per[2, 2] = -(f+ n) / (n-f);
		M_per[2, 3] = -(2.0F * f * n) / (f - n);
		M_per[3, 2] = -1.0F;
		
		return M_per;
	}
Og kameramatrisen WorldCam():



http://s14.postimg.org/mx2b9pz0t/world_To_Cam.jpg

Kode

	Matrix4x4 CreateWorldCam()
	{
		
		Matrix4x4 W2C = new Matrix4x4();  
		W2C = Matrix4x4.identity;
		
		W2C [0, 3] = u;
		W2C [1, 3] = v;
		W2C [2, 3] = w;
		
		return W2C;
	}

HVORFOR ender jeg opp med å se feil vei?? Jeg perspektivet går feil vei, altså objektene er mindre foran og eser ut bakover.

Og HVORDAN implementerer jeg rotasjon av vinkelen på kameraet? Forklar gjerne teoretisk, jeg forstår jeg bare prinsippet så skal jeg finne det ut

EDIT: De er feil vei om jeg stiller meg på baksiden, de er egentlig riktig vei, men da er jeg opp ned. Slik ser det ut:

http://s30.postimg.org/4gdi4hgt9/resultate.jpg

Siste bildet, uten fult navn, lol.

http://s24.postimg.org/6bfzg16qp/resultate.jpg
Sist endret av Tøffetom; 23. oktober 2015 kl. 13:28. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
La oss først gå igjennom koden og se på hva du har her.

Kode

         Camera camera = GetComponent<Camera>();
	 camera.projectionMatrix = CreateM();
	 camera.worldToCameraMatrix = CreateWorldCam();
Hvor er metoden CreateM? Du har listet opp metoden CreatePerspective, men bruker du den? Formelen sier -(f+n)/f-n, men koden(i CreatePerspective) din sier M_per[2, 2] = -(f+ n) / (n-f), er det en spesiell grunn til det? Jeg ser forsåvidt noe av det samme i ortho-matrisen din, M_orth[2,2] = 2/(n-f), mens formelen sier noe annet. Hva er årsaken til avvikene?

Jeg skulle gjerne også visst hva verdiene for near, far, left, right, top, bottom, etc også er.

Kan du poste hele .cs filen din, siste kjørende versjon, slik at det ikke er noen tvil i hvilken kode som faktisk blir kjørt?
Sist endret av m0b; 23. oktober 2015 kl. 14:49.
Sitat av |d13m0b Vis innlegg
La oss først gå igjennom koden og se på hva du har her.

Kode

         Camera camera = GetComponent<Camera>();
	 camera.projectionMatrix = CreateM();
	 camera.worldToCameraMatrix = CreateWorldCam();
Hvor er metoden CreateM? Du har listet opp metoden CreatePerspective, men bruker du den? Formelen sier -(f+n)/f-n, men koden(i CreatePerspective) din sier M_per[2, 2] = -(f+ n) / (n-f), er det en spesiell grunn til det? Jeg ser forsåvidt noe av det samme i ortho-matrisen din, M_orth[2,2] = 2/(n-f), mens formelen sier noe annet. Hva er årsaken til avvikene?

Jeg skulle gjerne også visst hva verdiene for near, far, left, right, top, bottom, etc også er.

Kan du poste hele .cs filen din, siste kjørende versjon, slik at det ikke er noen tvil i hvilken kode som faktisk blir kjørt?
Vis hele sitatet...
Det skal jeg gjøre, grunnen til at de er forskjellig er sannsynligvis at jeg klippet formlene fra nettet, mens jeg har brukt læremateriale. Er jo mange forskjellige versjoner avhengig av hvilken orientering de respektive koordinatsystemene har og hvilken retning man ser. Her er synsretning -z. Misstenker at det nettopp er disse variasjonene er årsak til forvirring , i tillegg til å skulle stemme med seg selv så må de jo stemme med unity sine matriser som ligger i kulissene å lurker. Har bare holdt på med dette i 2 mnd så har mildt sagt lite kontroll

Grunnen til at jeg går via M, og derfor tilsynelatende ikke bruker matrisene, er at jeg ville kunne endre dem i runtime. Så ved å endre faktoren m (1,2 eller3) så endrer du fra orth til per, og nå også per2 i et mislykket forsøk på å løse dette.

Kode

using UnityEngine;
using System.Collections;



public class VievingAssignment : MonoBehaviour {
	
	//[l , .. , Far] = Bounding Box of the projection transformations
	//[u,v,w] = coordinatesystem representing camera ("eye"). Right-handed basis. 
	//[m] (only for effectivity) = factor for changing transformationmatrices during update, thus relieving the need for restarts.
	//[s,ws] the increment value for changes to the above during runtime
	public float l, r , b, t, n, f, u, v, w, ws = 0.3F, s = 1, m = 1; 
	
	// Spawn random cubes for evaluation of transformations. 
	
	public int numCubes = 10; 
	
	
	void Start() {
		
		//Random cubes around canonical coordinatesystem's origo. 
		for(int i = 0; i<10; i++) {                
			GameObject block = GameObject.CreatePrimitive(PrimitiveType.Cube);     
			block.transform.localScale = new Vector3(2*(Random.value), 2*(Random.value), 2*(Random.value));;
			block.transform.position = new Vector3(4*(Random.value), 4*(Random.value), 4*(Random.value));
		}                
	}
	
	
	//2.1 Matrix for "The Orthographic Projection Transformation"
	//The viewport matrix multiplied with the "orthographic view volume"-Bounding box
	//The "canonical view volume" is it's predecessor. 
	Matrix4x4 CreateOrtho()
	{
		Matrix4x4 M_orth = new Matrix4x4();
		
		M_orth[0,0] = 2/(r-l); 
		M_orth[0,3] = -((r+l)/(r-l)); 
		
		M_orth[1,1] = 2/(t-b); 
		M_orth[1,3] = -((t+b)/(t-b)); 
		
		M_orth[2,2] = 2/(n-f); 
		M_orth[2,3] = -((n+f)/(n-f));
		
		M_orth[3,3] = 1; 
		
		return M_orth;
	}
	
	
	//2.2 The "Perspective Projection Matrix". 
	//In this orthorgraphic infrastructure M_orth is replaced by Mper -> Inserting the perspective matrix after the Mcam but before orthographic projection. 
	Matrix4x4 CreatePerspective()
	{
		Matrix4x4 M_per = new Matrix4x4();
		M_per[0, 0] = (2.0F * n) / (r - l);
		M_per[0, 2] = (r + l) / (l-r);
		M_per[1, 1] = (2.0F * n) / (t - b);
		M_per[1, 2] = (t + b) / (b-t);
		M_per[2, 2] = -(f+ n) / (n-f);
		M_per[2, 3] = -(2.0F * f * n) / (f - n);
		M_per[3, 2] = -1.0F;
		
		return M_per;
	}
	
	Matrix4x4 CreatePerspective2()
	{
		Matrix4x4 M_per = new Matrix4x4();
		M_per[0, 0] = (2.0F * n) / (l - r);
		M_per[0, 2] = (l - r) / (r-l);
		M_per[1, 1] = (2.0F * n) / (t - b);
		M_per[1, 2] = (b + t) / (b-t);
		M_per[2, 2] = -(f+ n) / (n-f);
		M_per[2, 3] = -(2.0F * f * n) / (f - n);
		M_per[3, 2] = -1.0F;
		
		return M_per;
	}
	
	
	
	
	//2.3 The "Canonical-to-basis Matrix". 
	//Conversion of the xyz coordinates into uvw-coordinates uses this matrix. 
	Matrix4x4 CreateWorldCam()
	{
		
		Matrix4x4 W2C = new Matrix4x4();  
		W2C = Matrix4x4.identity;
		
		W2C [0, 3] = u;
		W2C [1, 3] = v;
		W2C [2, 3] = w;
		
		return W2C;
	}
	
	//3.1 To enable alteration of the bounding box during runtime. Factor "s"
	// Left button increases size, right decrease and middle resets. 
	void IsScaling() {
		if (Input.GetMouseButtonDown (0)) {
			r = r-s;
			l = l+s; 
			b = l-s;
			t = t+s;
		}
		if (Input.GetMouseButtonDown (1)) {
			r = r+s;
			l = l-s; 
			b = l+s;
			t = t-s;
		}
		if (Input.GetMouseButtonDown (2)) {
			r = -1; 
			l = 1;
			b = -1; 
			t = 1; 
		}
	}
	
	//3.2 To enable alteration of the parameters during runtime.
	// Alters the uvw coordinates. It uses standard "wasd" for movement horizontal movement, "r" and "f" for up and down respectively. 
	// Left button increases size, right decrease and middle resets. 
	void IsWalking(){
		if(Input.GetKeyDown("w")) 
			w = w + ws;
		if(Input.GetKeyDown("s")) 
			w = w - ws;
		if(Input.GetKeyDown("a")) 
			u = u - ws;
		if(Input.GetKeyDown("d"))
			u = u + ws;
		if(Input.GetKeyDown("r")) 
			v = v + ws;
		if(Input.GetKeyDown("f")) 
			v = v - ws;
	}
	
	//4.0
	//This is the method that implements runtime changes by checking for scaling of bounding box or movement first.
	//Altered movement is then used as the "M" matrix is created, depending on desired projection form. 
	Matrix4x4 CreateM()
	{
		IsScaling (); 
		IsWalking (); 
		
		Matrix4x4 M = new Matrix4x4();
		
		if (m == 1){
			M = CreateOrtho();
		}
		
		if (m == 2){
			M = CreatePerspective();
		}
		if (m == 3){
			M = CreatePerspective2();
			
		}    
		
		return M;
	}
	
	//5.0 The update functions only calls for projection and worldToCameraMatrix, assigning them to the camera this script is attached to. 
	void Update()
	{
		
		Camera camera = GetComponent<Camera>();
		camera.projectionMatrix = CreateM();
		camera.worldToCameraMatrix = CreateWorldCam();
		
		//Print Matrices to see alerting values
		print("camera.projectionMatrix = "+camera.projectionMatrix);
		print("camera.WorldToCameraMatrix = "+camera.projectionMatrix);
		
	}
	
	
	
	
	
}
Unngå isScaling, den fucker bare opp enda mer.
Sist endret av Tøffetom; 23. oktober 2015 kl. 16:15. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Okei, flott. Det jeg legger merke til er blant annet at ingen av verdiene er initialiserte, og det vil resultere i en rekke not-a-number-feil og feilmeldinger om posisjon og frustum. Om du initialiserer disse i Unity så er jo det selvsagt ikke noe problem.

Forsøk med denne matrisen, og så initialiserer du top, bottom, left og right til ønsket størrelse, og ikke minst far og near for å opprette et frustum. Når du deretter pauser i Unity vil du kunne se frustumet du har opprettet og det bør i tillegg også rendres korrekt.

Kode

        M_per[0, 0] = 2.0F * n / (r - l);
        M_per[0, 2] = (r + l) / (r - l);
        M_per[1, 1] = (2.0F * n) / (t - b);
        M_per[1, 2] = (t + b) / (t - b);
        M_per[2, 2] = -(f + n) / (f - n);
        M_per[2, 3] = -(2.0F * f * n) / (f - n);
        M_per[3, 2] = -1.0F;
For å angripe problemene steg for steg, kommenterte jeg i denne omgang ut worldToCameraMatrix. Om matrisen er satt til kun identity, tror jeg den er snudd pi radianer om Y-aksen.

Du bør også introdusere variabelen numCubes til for-loopen din, slik at den har en betydning.

Kode

for (int i = 0; i < numCubes; i++)
Sist endret av m0b; 23. oktober 2015 kl. 17:30.
ah, det glemte jeg nevne, i unity er alle variablene som er deklarert public initialisert i respektive felt der scriptet er festet. Så det holder å deklarere dem, så kan de endres runtime. Skla teste ut.

Sitat av |d13m0b Vis innlegg
Okei, flott. Det jeg legger merke til er blant annet at ingen av verdiene er initialiserte, og det vil resultere i en rekke not-a-number-feil og feilmeldinger om posisjon og frustum. Om du initialiserer disse i Unity så er jo det selvsagt ikke noe problem.

Forsøk med denne matrisen, og så initialiserer du top, bottom, left og right til ønsket størrelse, og ikke minst far og near for å opprette et frustum. Når du deretter pauser i Unity vil du kunne se frustumet du har opprettet og det bør i tillegg også rendres korrekt.

Kode

        M_per[0, 0] = 2.0F * n / (r - l);
        M_per[0, 2] = (r + l) / (r - l);
        M_per[1, 1] = (2.0F * n) / (t - b);
        M_per[1, 2] = (t + b) / (t - b);
        M_per[2, 2] = -(f + n) / (f - n);
        M_per[2, 3] = -(2.0F * f * n) / (f - n);
        M_per[3, 2] = -1.0F;
For å angripe problemene steg for steg, kommenterte jeg i denne omgang ut worldToCameraMatrix. Om matrisen er satt til kun identity, tror jeg den er snudd pi radianer om Y-aksen.

Du bør også introdusere variabelen numCubes til for-loopen din, slik at den har en betydning.

Kode

for (int i = 0; i < numCubes; i++)
Vis hele sitatet...
Nei det må visst være den jeg hadde for at det skal funke, eller så må eventuelt din løsning implementeres sammen med en kombinert endring av worldtocam-matrisen. Problemet er jo det at unity sitt kamera tar seg av flere beregninger bak kulissene, noe som gjør at mange korrekte alternativer ikke funker i praksis.

Får notere det i rapporten og heller leve med at det blir opp ned. Så kan vi drøfte når jeg har litt bedre tid hva som problemet er - så lenge jeg kan forklare hva som er gale når eksamen dukker opp skal det ikke påvirke karakteren

Tusen takk for hjelp så langt, men enda jeg leverer inn så er jeg definitivt ikke ferdig med denne sakne.

Nå skal jeg på date.
Sist endret av Tøffetom; 23. oktober 2015 kl. 19:13. Grunn: Automatisk sammenslåing med etterfølgende innlegg.