private void Render(object sender, GlControlEventArgs e) { if (_shader == null) { return; } var v = _cameraHelper.CameraMatrix; _shader.M = v; _shader.ShadingLevel = 0; FiguresHelper.Draw3DCross(4, 1); _shader.ShadingLevel = 1; _shader.LightPos = new Vector3(1f, 1f, 1f); var r1 = Matrix4x4.CreateRotationY(Mathf.ToRadian(_phi)); var t = Matrix4x4.CreateTranslation(new Vector3(_radius, 2f, 0f)); var r2 = Matrix4x4.CreateRotationX(Mathf.ToRadian(90)) * Matrix4x4.CreateRotationY(Mathf.ToRadian(90)) * Matrix4x4.CreateRotationZ(Mathf.ToRadian(45)); var scaleM = Matrix4x4.CreateScale(0.2f); var r3 = Matrix4x4.CreateRotationY(Mathf.ToRadian(-_phi * 10)); var r4 = Matrix4x4.CreateRotationZ(Mathf.ToRadian(25)); var m = r3 * r2 * t * r1 * scaleM * r4; _shader.M = m * v; Figure3DHelper.DrawMesh(_boomerang, Colors.Chocolate); _phi += _step; }
/// <summary> /// Palauttaa käänteisen transformaatiomatriisin jolla voi ottaa huomioon ruudun kokoon, /// kiertoon ja paikkaan tehdyt muutokset. /// Ennen transformaatiota: paikkavektori RenderTargetin koordinaateissa /// Transformaation jälkeen: paikkavektori ikkunan koordinaateissa /// </summary> /// <returns></returns> internal Matrix GetScreenInverse() { return(Matrix.CreateScale(scaleInv) * Matrix.CreateRotationZ(-angle) * Matrix.CreateTranslation(center.X, center.Y, 0)); }
/// <summary> /// Palauttaa transformaatiomatriisin jolla voi ottaa huomioon ruudun kokoon, /// kiertoon ja paikkaan tehdyt muutokset. /// Ennen transformaatiota: paikkavektori ikkunan koordinaateissa /// Transformaation jälkeen: paikkavektori RenderTargetin koordinaateissa /// </summary> /// <returns></returns> internal Matrix GetScreenTransform() { return(Matrix.CreateScale(scale) * Matrix.CreateRotationZ(angle) * Matrix.CreateTranslation(-center.X, -center.Y, 0)); }