Re: Portal BGE

Posté par Bobibou le 22/10/2010 20:22:15
Citation :
Tu fera attention, il manque une lettre ligne 69 : c'est axey.imag et pas xey.imag (désolé, c'est de ma faute...).

Oui, oui, j'ai vu, puis un peu avant aussi, tu es pas d'accord avec toi même...Tu mets un coup nor_1, un coup nor_p1
Enfin si tu as regardé mon blend, tu as dû constater que j'ai corrigé.

Citation :
Tu es en terminale S ?

Oui, je sais que ça viendra cette année, mais j'ai pas envie d'attendre. Je sais pas pourquoi on voit pas ça plutôt...Les STI voient les complexes en 1ère, les ES voient les matrices en 1ère, mais nous, S, on a encore vu ni l'un ni l'autre.
Enfin bon. J'ai regardé ce qu'est la transposition, et c'est simplissime. C'est plus l'inversion que j'ai pas compris mais vu que diviser par un nombre revient à multiplier par son inverse, je suppose que ça marche de la même façon pour les matrices : *invert(mat) est l'opération inverse de *mat.
D'ailleurs, c'est ce que j'utilise pour mes rotations (pour les objets, pas pour le joueur) et ça marche.

J'ai tenté de convertir le script du blend de Warwickallison pour la 2.5, mais ça fait des trucs bizarres.
Le script :
from bge import logic as gl
import VideoTexture
from mathutils import *

cont = gl.getCurrentController()
scene = gl.getCurrentScene()
viewer = scene.active_camera
viewpos = viewer.position
r180 = Matrix.Rotation(180, 3, 'Y')
unmir = Matrix.Scale(-1, 3, Vector([1,0,0]))
for pss in [1,2,3]:
	n = 0
	for s in cont.sensors:
		portal = s.owner
		if 'otherportal' in portal:
			otherportal = scene.objects[portal['otherportal']]
		else:
			otherportal = cont.sensors[len(cont.sensors)-1-n].owner
		n+=1
		cam = scene.objects[portal.name+"cam"]
		m1=Matrix(*portal.orientation)
		m1.transpose()
		m1.invert()
		m2=Matrix(*otherportal.orientation)
		m2.transpose()
		
		if pss == 1:
			# Update video textures
			offset = Vector([0,0,0])
			if 'offset' in cam:
				offset = cam['offset']
			cam.position = Vector(otherportal.position) + \
				(Vector(viewpos) - Vector(portal.position))*m1*unmir*m2 + offset
			if 'video' in cam:
				cam['video'].refresh(False)
			else:
				matID=0
				video = VideoTexture.Texture(portal, matID)
				video.source = VideoTexture.ImageMirror(scene,cam,otherportal,matID)
				sz = 256
				if 'videosize' in cam:
					sz = cam['videosize']
				video.source.capsize = [sz,sz]
				video.source.background = [0,0,0,255] # black
				cam['video'] = video
		elif pss == 2:
			# Remove old fake objects
			if 'lasthits' in portal:
				for ob in portal['lasthits']:
					if ob not in s.hitObjectList:
						if 'portalcopy' in ob and ob['portalcopy'] != None:
							ob['portalcopy'].endObject()
							ob['portalcopy'] = None

		else:
			# Create/move fake objects
			list = []
			for ob in s.hitObjectList:
				if 'fake' not in ob:
					print(ob,"hit",portal)
					if 'portalcopy' in ob and ob['portalcopy'] != None:
						copy = ob['portalcopy']
					else:
						copy = scene.addObject(ob,ob,0)
						copy['fake'] = 1
						ob['portalcopy'] = copy
					opos = (Vector(ob.position) - Vector(portal.position))*m1
					copy.position = Vector(otherportal.position) + opos*r180*m2
					copy.localScale = ob.localScale
					ori = Matrix(*ob.orientation)
					ori.transpose()
					ori = ori*m1*r180*m2
					ori.transpose()
					copy.orientation = ori
					if opos[2] < 0: # Portal mesh is Z plane
						# Teleport
						ob.position,copy.position = copy.position,ob.position
						ob.orientation,copy.orientation = copy.orientation,ob.orientation
						ob.setLinearVelocity(Vector(ob.getLinearVelocity())*m1*r180*m2)
						ob.setAngularVelocity(Vector(ob.getAngularVelocity())*m1*r180*m2)
					list += [ob]
			portal['lasthits'] = list
		


Je pensais au début que le problème venait du fait que la matrice de rotation en 2.5 est la transposée de la matrice de rotation en 2.49. J'ai donc retiré toutes les lignes qui transposent les matrices (4 lignes si je n'en ai pas loupé). Mais il s'avère que ça bug toujours.

Edit : J'ai pas trop compris l'intérêt de la rotation à 180° non plus...Toujours est-il qu'il faut passer cette valeur en radians pour que ça marche...

Cette contribution était de : http://blenderclan.tuxfamily.org/html/newbb/viewtopic.php?forum=3&topic_id=27924&post_id=347434