Пример #1
0
func (r *Receiver) Simulate(gameTime gameloop.GameTime) {
	r.SimulationTime = gameTime
	deltaT := gameTime.Delta.Seconds()

	if !r.UIState.Impulse.ApproxEqual(glm.Vec4d{}) {
		regulatedImpulse := r.UIState.Impulse.Normalize().Mul(r.Constants.PlayerImpulseMomentumLimit)
		viewAdjustedImpulse := gtk.ToHomogVec4D(r.Player.OrientationH.Rotate(gtk.ToVec3D(regulatedImpulse)))
		r.Player.Velocity = r.Player.Velocity.Add(viewAdjustedImpulse)
		r.UIState.Impulse = glm.Vec4d{}
	}

	aggregateVelocity := r.Player.Velocity
	if !r.UIState.Movement.ApproxEqual(glm.Vec4d{}) {
		regulatedMovement := r.UIState.Movement.Normalize().Mul(r.Constants.PlayerMovementLimit)
		viewAdjustedMovement := gtk.ToHomogVec4D(r.Player.OrientationH.Rotate(gtk.ToVec3D(regulatedMovement)))
		aggregateVelocity = aggregateVelocity.Add(viewAdjustedMovement)
	}

	dp := aggregateVelocity.Mul(deltaT)

	for _, p := range r.Portals {
		portalview := p.Portalview
		pos := portalview.Mul4x1(r.Player.Position)
		v := portalview.Mul4x1(dp)

		if pos[2] < 0 && v[2] > 0 {
			t := -pos[2] / v[2]
			hit := pos.Add(v.Mul(t))
			if math.Abs(float64(hit[0])) <= 1 &&
				math.Abs(float64(hit[1])) <= 1 &&
				t > 0 && t <= 1 {
				// fmt.Println("crossed portal", i, pos)
				ti := p.Transform.Inv()
				r.Player.Transform(ti)
				dp = ti.Mul4x1(dp)
				r.Data.Inception = r.Data.Inception.Mul4(p.Transform)
				break
			}
		}
	}

	p0 := r.Player.Position
	r.Player.Position = p0.Add(dp)

	//apply gravity if player is off the ground (ys==0)
	if r.Player.Position[1] > 1 {
		r.Player.Velocity[1] = r.Player.Velocity[1] + r.Constants.Gravity*deltaT
	} else {
		r.Player.Velocity[1] = 0
		if p0[1] >= 1 {
			r.Player.Position[1] = 1
		}
	}

	p := r.Player.Position
	translate := glm.Translate3Dd(-p[0], -p[1], -p[2])
	rotation := r.Player.Orientation.Conjugate().Mat4()
	r.Data.Cameraview = rotation.Mul4(translate)
}
Пример #2
0
func (r *Receiver) PanView(pos, delta glm.Vec2d) {
	theta := delta.Mul(r.Constants.PanSensitivity * r.Constants.Fov)

	turnV := glm.QuatRotated(theta[1], gtk.ToVec3D(r.UIState.TiltAxis))
	turnH := glm.QuatRotated(-theta[0], gtk.ToVec3D(r.UIState.PanAxis))

	r.UIState.Orientation = turnH.Mul(r.UIState.Orientation).Mul(turnV)
}
Пример #3
0
func (r *Receiver) PanView(pos, delta glm.Vec2d) {
	theta := delta.Mul(r.Constants.PlayerFOV * r.Constants.PlayerPanSensitivity)

	turnV := glm.QuatRotated(theta[1], gtk.ToVec3D(r.Player.TiltAxis))
	turnH := glm.QuatRotated(-theta[0], gtk.ToVec3D(r.Player.PanAxis))

	r.Player.OrientationH = turnH.Mul(r.Player.OrientationH)
	r.Player.Orientation = turnH.Mul(r.Player.Orientation).Mul(turnV)

	r.Invalid = true
}