/* Update transform matrix and right/up/forward vectors */ func (t *Transform) Update(dt float32) { // todo: avoid recalculating unless something has changed /* Update transform */ rad := t.Rotation.Mul(math.Pi / 180.0) // translate rotaiton to radians rotation := mgl.AnglesToQuat(rad[0], rad[1], rad[2], mgl.XYZ).Mat4() scaling := mgl.Scale3D(t.Scale[0], t.Scale[1], t.Scale[2]) translation := mgl.Translate3D(t.Position[0], t.Position[1], t.Position[2]) /* New transform matrix: S * R * T */ //m := scaling.Mul4(rotation.Mul4(translation)) m := translation.Mul4(rotation.Mul4(scaling)) /* Grab axis vectors from transformation matrix */ t.Right[0] = m[4*0+0] // first column t.Right[1] = m[4*1+0] t.Right[2] = m[4*2+0] t.Up[0] = m[4*0+1] // second column t.Up[1] = m[4*1+1] t.Up[2] = m[4*2+1] t.Forward[0] = -m[4*0+2] // third column t.Forward[1] = -m[4*1+2] t.Forward[2] = -m[4*2+2] /* Update transformation matrix */ t.Matrix = m }
//NewTransform defines a new Rotation and Translation //x, y, z are the angle in degrees rotation around the repsective axis //addition is true when this will be applied in addition to an existing orientation //localref is true if the orientation should be applied in the object local reference //or in the absolute reference. If addition is false this has no effect //xt, yt, zt are the translation offset to apply in the x, y, and z axis //transabs is true when this translation will be applied in relation to the current //translation ZXY YZX XYZ func NewTransform(x, y, z float32, rot RotationType, xt, yt, zt float32, tran TranslationType) *Transform { return &Transform{ quat: mgl32.AnglesToQuat(mgl32.DegToRad(z), mgl32.DegToRad(y), mgl32.DegToRad(x), mgl32.ZYX), rType: rot, trans: mgl32.Vec3{xt, yt, zt}, tType: tran, } }
func (t *Transform2D) Update(dt float32) { /* Update transform */ rad := t.Rotation * math.Pi / 180.0 rotation := mgl.AnglesToQuat(0, 0, rad, mgl.XYZ).Mat4() scaling := mgl.Scale3D(t.Scale[0], t.Scale[1], 1) translation := mgl.Translate3D(t.Position[0], t.Position[1], t.Position[2]) /* New transform matrix: S * R * T */ t.Matrix = scaling.Mul4(rotation.Mul4(translation)) }