5 / 5 / 0
Регистрация: 22.01.2020
Сообщений: 77
1

Вращение объекта вокруг локальных координат в OpenTK

07.10.2020, 18:53. Показов 5148. Ответов 41

Author24 — интернет-сервис помощи студентам
Собственно, вопрос простой ,но пока непонятный для меня! Как в OpenTK можно реализовывать вращение объектa на сцене вокруг локальных координат???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2020, 18:53
Ответы с готовыми решениями:

C# OpenTK Вращение камеры вокруг своей оси
Итак, я начал разбираться в OpenGL, выбрал язык C# и библиотеку OpenTk. Привожу код моего творения:...

Вращение вокруг сировой системы координат
Нужно сделать так, чтобы вращение осуществлялось вокруг не модельной системы координат, в той...

Вращение вокруг прежних координат
У меня вот такая проблема Я сделал изменение координат вот так ball.Kordinat(Ox, Oy, Oz); ...

Вращение кубика вокруг начала координат
В общем следующая проблема: кубик должен крутиться вокруг начала координат, но он странно...

41
Just Do It!
3837 / 2283 / 636
Регистрация: 23.09.2014
Сообщений: 7,053
Записей в блоге: 2
11.10.2020, 19:19 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
XLAT, Сейчас напишу небольшой проект
давайте, а то я пока выравнивал игзампл ещё и глюк c FOV тамошний(SDK OpenTK взятый где-то на просторах инета)
пришлось исправлять:
сам исходник:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
// This code was written for the OpenTK library and has been released
// to the Public Domain.
// It is provided "as is" without express or implied warranty of any kind.
 
using System;
using System.Drawing;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
using System.IO;
using System.Text;
 
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
 
using Examples.Shapes;
using Examples.TextureLoaders;
 
namespace Examples.Tutorial
{
    [Example("DDS Cube Map", ExampleCategory.OpenGL, "2.x", Documentation = "DDSCubeMap")]
    public class T13_GLSL_Earth: GameWindow
    {
        public T13_GLSL_Earth( )
            : base( 800, 800 )
        {
            AY = 0.0f;
            A  = 0.0f;
        }
 
        #region internal Fields
 
        // Shader
        int VertexShaderObject, FragmentShaderObject, ProgramObject;
        const string VertexShaderFilename = "Data/Shaders/CubeMap_VS.glsl";
        const string FragmentShaderFilename = "Data/Shaders/CubeMap_FS.glsl";
 
        // Textures
        const TextureUnit TMU0_Unit = TextureUnit.Texture0;
        const int TMU0_UnitInteger = 0;
        const string TMU0_Filename = "Data/Textures/earth-cubemap.dds";
        uint TMU0_Handle;
        TextureTarget TMU0_Target;
 
        // DL
        DrawableShape sphere;
 
        // Camera
        Vector3 EyePos = new Vector3( 0.0f, 0.0f, 6.0f );
        Vector3 Trackball = Vector3.Zero;
 
        #endregion internal Fields
 
        /// <summary>Setup OpenGL and load resources here.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnLoad(EventArgs e)
        {
            this.VSync = VSyncMode.Off;
 
            // Check for necessary capabilities:
            string extensions = GL.GetString(StringName.Extensions);
            if (!GL.GetString(StringName.Extensions).Contains("GL_ARB_shading_language"))
            {
                throw new NotSupportedException(String.Format("This example requires OpenGL 2.0. Found {0}. Aborting.",
                    GL.GetString(StringName.Version).Substring(0, 3)));
            }
 
            if (!extensions.Contains("GL_ARB_texture_compression") ||
                 !extensions.Contains("GL_EXT_texture_compression_s3tc"))
            {
                throw new NotSupportedException("This example requires support for texture compression. Aborting.");
            }
 
            #region GL State
 
            GL.ClearColor( 0f, 0f, 0f, 0f );
 
            GL.Disable( EnableCap.Dither );
 
            GL.Enable( EnableCap.CullFace );
            GL.FrontFace( FrontFaceDirection.Ccw );
            GL.PolygonMode( MaterialFace.Front, PolygonMode.Fill );
            //  GL.PolygonMode( MaterialFace.Back, PolygonMode.Line );
 
            #endregion GL State
 
            #region Shaders
 
            string LogInfo;
 
            // Load&Compile Vertex Shader
 
            using ( StreamReader sr = new StreamReader( VertexShaderFilename ) )
            {
                VertexShaderObject = GL.CreateShader( ShaderType.VertexShader );
                GL.ShaderSource( VertexShaderObject, sr.ReadToEnd( ) );
                GL.CompileShader( VertexShaderObject );
            }
 
            GL.GetShaderInfoLog( VertexShaderObject, out LogInfo );
            if ( LogInfo.Length > 0 && !LogInfo.Contains( "hardware" ) )
                Trace.WriteLine( "Vertex Shader failed!\nLog:\n" + LogInfo );
            else
                Trace.WriteLine( "Vertex Shader compiled without complaint." );
 
            // Load&Compile Fragment Shader
 
            using ( StreamReader sr = new StreamReader( FragmentShaderFilename ) )
            {
                FragmentShaderObject = GL.CreateShader( ShaderType.FragmentShader );
                GL.ShaderSource( FragmentShaderObject, sr.ReadToEnd( ) );
                GL.CompileShader( FragmentShaderObject );
            }
            GL.GetShaderInfoLog( FragmentShaderObject, out LogInfo );
 
            if ( LogInfo.Length > 0 && !LogInfo.Contains( "hardware" ) )
                Trace.WriteLine( "Fragment Shader failed!\nLog:\n" + LogInfo );
            else
                Trace.WriteLine( "Fragment Shader compiled without complaint." );
 
            // Link the Shaders to a usable Program
            ProgramObject = GL.CreateProgram( );
            GL.AttachShader( ProgramObject, VertexShaderObject );
            GL.AttachShader( ProgramObject, FragmentShaderObject );
 
            // link it all together
            GL.LinkProgram( ProgramObject );
 
            // flag ShaderObjects for delete when not used anymore
            GL.DeleteShader( VertexShaderObject );
            GL.DeleteShader( FragmentShaderObject );
 
            int[] temp = new int[1];
            GL.GetProgram(ProgramObject, GetProgramParameterName.LinkStatus, out temp[0]);
            Trace.WriteLine( "Linking Program (" + ProgramObject + ") " + ( ( temp[0] == 1 ) ? "succeeded." : "FAILED!" ) );
            if ( temp[0] != 1 )
            {
                GL.GetProgramInfoLog( ProgramObject, out LogInfo );
                Trace.WriteLine( "Program Log:\n" + LogInfo );
            }
 
            GL.GetProgram(ProgramObject, GetProgramParameterName.ActiveAttributes, out temp[0]);
            Trace.WriteLine( "Program registered " + temp[0] + " Attributes. (Should be 4: Pos, UV, Normal, Tangent)" );
 
            Trace.WriteLine( "Tangent attribute bind location: " + GL.GetAttribLocation( ProgramObject, "AttributeTangent" ) );
 
            Trace.WriteLine( "End of Shader build. GL Error: " + GL.GetError( ) );
 
            #endregion Shaders
 
            #region Textures
 
            TextureLoaderParameters.FlipImages = false;
            TextureLoaderParameters.MagnificationFilter = TextureMagFilter.Linear;
            TextureLoaderParameters.MinificationFilter = TextureMinFilter.Linear;
            TextureLoaderParameters.WrapModeS = TextureWrapMode.ClampToEdge;
            TextureLoaderParameters.WrapModeT = TextureWrapMode.ClampToEdge;
            TextureLoaderParameters.EnvMode = TextureEnvMode.Modulate;
 
            ImageDDS.LoadFromDisk( TMU0_Filename, out TMU0_Handle, out TMU0_Target );
            Trace.WriteLine( "Loaded " + TMU0_Filename + " with handle " + TMU0_Handle + " as " + TMU0_Target );
 
            #endregion Textures
 
            Trace.WriteLine( "End of Texture Loading. GL Error: " + GL.GetError( ) );
            Trace.WriteLine( "");
 
            sphere = new SlicedSphere(1.5f, Vector3d.Zero, SlicedSphere.eSubdivisions.Four, new SlicedSphere.eDir[] { SlicedSphere.eDir.All }, true);
 
        }
 
        protected override void OnUnload(EventArgs e)
        {
            sphere.Dispose();
 
            GL.DeleteProgram( ProgramObject );
            GL.DeleteTextures( 1, ref TMU0_Handle );
 
            base.OnUnload( e );
        }
 
        /// <summary>Respond to resize events here.</summary>
        /// <param name="e">Contains information on the new GameWindow size.</param>
        /// <remarks>There is no need to call the base implementation.</remarks>
        protected override void OnResize( EventArgs e )
        {
            GL.Viewport( 0, 0, Width, Height );
 
            GL.MatrixMode( MatrixMode.Projection );
            Matrix4 p = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)Width / (float)Height, 0.1f, 100.0f);
            GL.LoadMatrix(ref p);
 
            GL.MatrixMode( MatrixMode.Modelview );
            GL.LoadIdentity( );
 
            base.OnResize( e );
        }
 
        /// <summary>Add your game logic here.</summary>
        /// <param name="e">Contains timing information.</param>
        /// <remarks>There is no need to call the base implementation.</remarks>
        protected override void OnUpdateFrame(FrameEventArgs e)
        {
            base.OnUpdateFrame(e);
 
            var keyboard = OpenTK.Input.Keyboard.GetState();
            var mouse = OpenTK.Input.Mouse.GetState();
 
            if (keyboard[OpenTK.Input.Key.Escape])
                this.Exit();
            if (keyboard[OpenTK.Input.Key.Space])
                Trace.WriteLine("GL: " + GL.GetError());
 
            Trackball.X = mouse.X;
            Trackball.Y = mouse.Y;
            Trackball.Z = mouse.Scroll.Y * 0.5f;
        }
 
        public float AY;
        public float A;
        /// <summary>Add your game rendering code here.</summary>
        /// <param name="e">Contains timing information.</param>
        /// <remarks>There is no need to call the base implementation.</remarks>
        protected override void OnRenderFrame(FrameEventArgs e)
       {
           this.Title = "FPS: " + (1 / e.Time).ToString("0.");
 
           GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
 
           GL.UseProgram(ProgramObject);
 
           #region Textures
 
           GL.ActiveTexture(TMU0_Unit);
           GL.BindTexture(TMU0_Target, TMU0_Handle);
 
           #endregion Textures
 
           #region Uniforms
 
           GL.Uniform1(GL.GetUniformLocation(ProgramObject, "Earth"), TMU0_UnitInteger);
 
            #endregion Uniforms
 
            AY += 0.001f;
            A  += 0.0002f;
 
            Matrix4 transform = Matrix4.Identity;
           
            GL.PushMatrix();
 
            EyePos.Z = 10;
 
            Matrix4 camera = Matrix4.LookAt(EyePos, Vector3.Zero, Vector3.UnitY);
 
            transform *= Matrix4.CreateRotationY(AY);
 
            transform *= Matrix4.CreateTranslation(3.0f, 0, 0);
            transform *= Matrix4.CreateRotationY(A);
 
            transform *= camera;
 
            GL.MultMatrix(ref transform);
 
           #region Draw
 
           GL.Color3(1f, 1f, 1f);
 
           sphere.Draw();
 
           #endregion Draw
 
           GL.PopMatrix();
 
           this.SwapBuffers();
       }
 
        /// <summary>Entry point</summary>
        [STAThread]
        public static void Main( )
        {
            using ( T13_GLSL_Earth example = new T13_GLSL_Earth( ) )
            {
                Utilities.SetWindowTitle(example);
                example.Run( 30.0, 0.0 );
            }
        }
    }
}
теория всё таже из моего первого ответа(без умничия):
https://www.cyberforum.ru/post14904325.html

всё работает:
ФПС = 100500
Вращение объекта вокруг локальных координат в OpenTK
0
5 / 5 / 0
Регистрация: 22.01.2020
Сообщений: 77
11.10.2020, 19:52  [ТС] 22
Я сейчас допишу более простой пример с исходником.Насчет белого окна- для меня загадка, вроде все робит)))

Добавлено через 1 минуту
zayats80888, Вот новый пример с исходником Test_2.rar

Добавлено через 4 минуты
XLAT, А под наклоном земля может вращаться вокруг свое оси (это то что мне нужно) ???
1
Just Do It!
3837 / 2283 / 636
Регистрация: 23.09.2014
Сообщений: 7,053
Записей в блоге: 2
11.10.2020, 19:54 23
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
Вот пример с исходником
Вращение объекта вокруг локальных координат в OpenTK

Неясно:
что здесь работает неправильно?

кликаю курсором на батоны:
модель вращается по соответствующим локальным к модели осям.

возможно, вам нужно вращать как раз в глобальных осях
0
5 / 5 / 0
Регистрация: 22.01.2020
Сообщений: 77
11.10.2020, 19:56  [ТС] 24
Повторюсь!У вас земля может вращаться под наклоном вокруг своей оси ??Это то что мне нужно
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
11.10.2020, 19:58 25
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
Вот новый пример с исходником
Я на шарпе не пишу, только С++

Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
На счет белого окна, для меня загадка- вроде все робит)))
Наверное это моделька белая на весь экран, голова обезьяны то же белая, но хотя бы контуры видно, чего-то там не подгрузилось. При попытке повернуть прилетает следущее:
Код
************** Текст исключения **************
System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Имя параметра: index
   в System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
   в System.Collections.Generic.List`1.get_Item(Int32 index)
   в Chameleon.Form1.MouseMoveForm(Object sender, MouseEventArgs e) в D:\Game_Test\OpenTK\Chameleon\Bild_001\Chameleon\Chameleon\Form1.cs:строка 414
   в System.Windows.Forms.Control.OnMouseMove(MouseEventArgs e)
   в System.Windows.Forms.Control.WmMouseMove(Message& m)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   в System.Windows.Forms.UserControl.WndProc(Message& m)
   в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
0
Just Do It!
3837 / 2283 / 636
Регистрация: 23.09.2014
Сообщений: 7,053
Записей в блоге: 2
11.10.2020, 20:12 26
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
А под наклоном земля может вращаться вокруг свое оси (это то что мне нужно) ???
если нужен наклон, то нужно добавить наклон:
C#
258
259
            const float NAKLON = 3.14f / 6.0f;
            transform *= Matrix4.CreateRotationX(NAKLON);
Вращение объекта вокруг локальных координат в OpenTK

Если мне не изменяет память, то наклон Земли равен ~30 градусов.
надеюсь на гифике он заметен.
0
zayats80888
11.10.2020, 20:23
  #27

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
Если мне не изменяет память, то наклон Земли равен ~30 градусов.
надеюсь на гифике он заметен.
Только у твоей земли времена года не меняются. :)
А это потому, что орбитальное движение - это не вращение, а перемещение.

0
5 / 5 / 0
Регистрация: 22.01.2020
Сообщений: 77
11.10.2020, 20:36  [ТС] 28
XLAT, Да не получается что-то Не понимаю я вас.Ну вот другой пример приведенный на картинки
Вращение объекта вокруг локальных координат в OpenTK

Там есть разноцветные оси за счет которых можно вращать объект вокруг своих осей. Вот как это можно реализовать??
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
11.10.2020, 20:43 29
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
Там есть разноцветные оси за счет которых можно вращать объект вокруг своих осей. Вот как это можно реализовать??
Я ж вам вроде написал как. Вам нужно сохранять матрицу вращения. И применять трансформации в нужном порядке.
Вот тут уже обсуждалось, посмотрите.Поворот объекта мышью
0
5 / 5 / 0
Регистрация: 22.01.2020
Сообщений: 77
11.10.2020, 20:49  [ТС] 30
Извините, сразу не понял))А можно поподробней насчет сохранения и трансформации))
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
11.10.2020, 21:03 31
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
А можно поподробней насчет сохранения и трансформации))
Я не любитель много писать, если б знал шарп, я б просто пример нактал, поэтому коротко.
Вам не нужно хранить углы вращения. Вам нужно хранит матрицу вращения (rotationMatrix). По событию мыши, если пользователь повернул на какой-то угол(относительный) вокруг какой-то оси, вы комбинируете этот поворот с этой матрицей, как я писал выше. В функции отрисовки вы просто считаете матрицу модели как transformMatrix = scaleMatrix * rotationMatrix * translationMatrix; и всё.
0
5 / 5 / 0
Регистрация: 22.01.2020
Сообщений: 77
11.10.2020, 21:09  [ТС] 32
Ну иcходя из этого " transform *= Matrix4.CreateFromAxisAngle(axis, deltaAngle); "

Что здесь " axis " а что " deltaAngle "???Если подробно??
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,331
11.10.2020, 21:14 33
Dimas_Pomor, файлы и картинки загружайте на форум, пока устное предупреждение, продолжите нарушать (правила форума п4.11) начну применять санкции
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
11.10.2020, 21:16 34
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
Что здесь " axis " а что " deltaAngle "???Если подробно??
axis - вектор, например ось X это (1, 0, 0).
deltaAngle - это на какой угол изменился поворот вокруг этой оси(как сильно юзер мышку дёрнул).
0
Just Do It!
3837 / 2283 / 636
Регистрация: 23.09.2014
Сообщений: 7,053
Записей в блоге: 2
11.10.2020, 21:29 35
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
Да не получается что-то Не понимаю я вас
а я не получил ответ на вопрос вос здесь:
https://www.cyberforum.ru/post14905257.html
думаете легко быть телепатом?

Цитата Сообщение от zayats80888 Посмотреть сообщение
Только у твоей земли времена года не меняются.
А это потому, что орбитальное движение - это не вращение, а перемещение.
ну согласно Птоломею, Солнце вращается вокруг Земли.
Эпициклы спасут космическую математику.


да ваша заметка, вроде и не оффтоп, проблемы вращения разбираем же

будем думать ...
0
5 / 5 / 0
Регистрация: 22.01.2020
Сообщений: 77
11.10.2020, 21:32  [ТС] 36
Извините Я чуть ниже объяснил как он должен вращаться
Там есть разноцветные оси за счет которых можно вращать объект вокруг своих осей. Вот как это можно реализовать??
0
Just Do It!
3837 / 2283 / 636
Регистрация: 23.09.2014
Сообщений: 7,053
Записей в блоге: 2
11.10.2020, 21:39 37
Цитата Сообщение от zayats80888 Посмотреть сообщение
Вам нужно хранит матрицу вращени
тут мне вот пока неясно:
будет ли накапливаться ошибка?

А то глядишь и через 100 лет Антарктида "вверху" окажется!

что подобно я уже делал давно, но уже щас не помню,
при долгом вращении у меня получалось "облако мрака"...


Добавлено через 3 минуты
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
Там есть разноцветные оси за счет которых можно вращать объект вокруг своих осей. Вот как это можно реализовать??
у ГОЛОВЫ нету никаких осей или исходник надо было перекомпилить?

если голова вращается правильно, то какие тогда могут быть вопросы?
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
11.10.2020, 21:43 38
Цитата Сообщение от XLAT Посмотреть сообщение
будет ли накапливаться ошибка?
С матрицами да. Но есть кватернионы!

Цитата Сообщение от XLAT Посмотреть сообщение
будем думать ...
Если хочется именно через вращение, то это перемещение можно представить как комбинацию двух вращений:
Вращение центра СК Земли вокруг Солнца (что у вас уже есть) и вращение самой СК Земли вокруг своего центра в той же плоскости, что и орбита, с той же угловой скоростью, только в обратном направлении.
1
5 / 5 / 0
Регистрация: 22.01.2020
Сообщений: 77
11.10.2020, 23:01  [ТС] 39
zayats80888, Что- то не получается!Может все таки раскошелиться па примерчик????

Добавлено через 1 час 2 минуты
XLAT,
у ГОЛОВЫ нету никаких осей или исходник надо было перекомпилить?
Нет нету.Может вы приведете примерчик с осями??
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
12.10.2020, 07:12 40
Цитата Сообщение от Dimas_Pomor Посмотреть сообщение
Нет нету
вот так ты хотел? Но тебе же выше писал zayats80888 что это надо сделать при помощи quaternions
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#include <GL/freeglut.h> // we use glut here as window manager
 
#include <math.h>
#ifndef M_PI
#define M_PI 3.1415926535897932385f
#endif
 
#include <sstream>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
 
 
 
class Renderer {
 
public:
  Renderer() : rot1(0.0),  rot2(0.0),  rot3(0.0) {}
 
public:
  void display() {
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
 
    // view scene from the side
    glTranslatef(0.0f,0.0f,-3.0f);
    glRotatef( -45.0f, 0.0f, 0.0f, 1.0f);
    glRotatef( -45.0f, 0.0f, 1.0f, 0.0f);
    glRotatef( 135.0f, 1.0f, 0.0f, 0.0f);
 
    // rotate around z
    glRotatef(rot1, 0.0f, 0.0f, 1.0f);
    glColor3f(0.0f, 0.0f, 1.0f);
    drawCoordinateAxisZ();
 
    // rotate around local y
    glRotatef(rot2, 0.0f, 1.0f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    drawCoordinateAxisY();
 
    // rotate around local x
    glRotatef(rot3, 1.0f, 0.0f, 0.0f);
    glColor3f(1.0f, 0.0f, 0.0f);
    drawCoordinateAxisX();
 
    // draw the plane in the local coordinate system
    drawToyPlane();
 
    glFlush();
  }
 
  void init() {
 
    // read vertex data from file
    std::ifstream input("ToyPlaneData.txt");
    if(!input) {
      cout << "Can not find vertex data file \"ToyPlaneData.txt\"" << endl;
    } else {
      int vertSize;
      double vertData;
      if(input >> vertSize) {
        if(vertSize > 0) {
          toyPlaneData.resize(vertSize);
          int i = 0;
          while(input >> vertData && i < vertSize) {
            // store it in the vector.
            toyPlaneData[i] = vertData;
            i++;
          }
          if(i != vertSize || vertSize % 3) toyPlaneData.resize(0);
        }
      }
      input.close();
    }
 
 
    // set opengl states
    glEnable(GL_DEPTH_TEST);
  }
 
  void resize(int w, int h) {
    // ignore this for now
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective (45.0, (float)w/(float)h, 0.1, 10.0);
  }
 
public:
  float rot1;
  float rot2;
  float rot3;
  std::vector <double> toyPlaneData;
 
private:
  void drawCoordinateAxisZ() {
    glBegin(GL_LINE_LOOP); // circle in x-y plane
    for(int a=0; a<360; a+=10) {
      float angle = M_PI / 180.0f * a;
      glVertex3f(cos(angle), sin(angle), 0.0);
    }
    glEnd();
 
    glBegin(GL_LINES);
    glVertex3f(0.9f, 0.0f, 0.0f); // x-axis
    glVertex3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 0.9f, 0.0f); // y-axis
    glVertex3f(0.0f, 1.0f, 0.0f);
    glVertex3f(0.0f, 0.0f,-1.0f); // z-axis
    glVertex3f(0.0f, 0.0f, 1.0f);
    glEnd();
 
    glBegin(GL_TRIANGLES); // z-axis tip
    glVertex3f(0.0f,-0.1f, 0.9f);
    glVertex3f(0.0f, 0.0f, 1.0f);
    glVertex3f(0.0f, 0.1f, 0.9f);
    glEnd();
  }
 
  void drawCoordinateAxisX() {
    glPushMatrix();
    glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
    drawCoordinateAxisZ();
    glPopMatrix();
  }
 
  void drawCoordinateAxisY() {
    glPushMatrix();
    glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
    drawCoordinateAxisZ();
    glPopMatrix();
  }
 
  void drawToyPlane() {
    glColor3f(0.5f, 0.5f, 0.5f);
    glBegin(GL_TRIANGLES);
    for(unsigned i=0; i < toyPlaneData.size(); i+=3) {
      glVertex3d(toyPlaneData[i],toyPlaneData[i+1], toyPlaneData[i+2]);
    }
    glEnd();
  }
};
 
//this is a static pointer to a Renderer used in the glut callback functions
static Renderer *renderer;
 
//glut static callbacks start
static void glutResize(int w, int h)
{
  renderer->resize(w,h);
}
 
static void glutDisplay()
{
  renderer->display();
  glutSwapBuffers();
}
 
static void glutKeyboard(unsigned char key, int x, int y) {
  bool redraw = false;
  float offset = 2.5f;
 
  if (glutGetModifiers() & GLUT_ACTIVE_ALT) {
    offset = -offset;
  }
  switch(key) {
    case '1':
      renderer->rot1 += offset;
      redraw = true;
      break;
    case '2':
      renderer->rot2 += offset;
      redraw = true;
      break;
    case '3':
      renderer->rot3 += offset;
      redraw = true;
      break;
    case '0':
      renderer->rot1 = 0.0f;
      renderer->rot2 = 0.0f;
      renderer->rot3 = 0.0f;
      redraw = true;
      break;
  }
  if(redraw) {
    std::stringstream ss;
    ss << "Yaw " <<  renderer->rot1 <<", Pitch " << renderer->rot2 << ", Roll " << renderer->rot3;
    glutSetWindowTitle(ss.str().c_str());
    glutDisplay();
  }
}
 
 
int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
  glutInitWindowPosition(100,100);
  glutInitWindowSize(320, 320);
 
  glutCreateWindow("Use 1, 2, and 3 keys to rotate (ALT+key rotates in other direction)");
 
  glutDisplayFunc(glutDisplay);
  //glutIdleFunc(glutDisplay);
  glutReshapeFunc(glutResize);
  glutKeyboardFunc(glutKeyboard);
 
  renderer = new Renderer;
  renderer->init();
 
  glutMainLoop();
}
Миниатюры
Вращение объекта вокруг локальных координат в OpenTK  
Вложения
Тип файла: rar Data.rar (21.8 Кб, 14 просмотров)
0
12.10.2020, 07:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2020, 07:12
Помогаю со студенческими работами здесь

Вращение объекта вокруг другого объекта
Как сделать вращение объекта вокруг другого объекта? Например: создаём куб, затем внутри него...

Вращение вокруг объекта
Добрый день. Как заставить один объект вращаться вокруг другого?

Вращение объекта вокруг точки
Здравствуйте. Потребовались формулы вращения объекта сразу по 3ем осям. Именно формулы, не...

Вращение модели вокруг объекта
Не могу понять, как вращать один объект, вокруг другого так, что б один конец вращался по дуге, а...

Как сделать свободное вращение камеры вокруг начала координат?
Как сделать свободное вращение камеры вокруг начала координат ?

Вращение объекта вокруг своей оси
Есть такой класс class TPoint(): def __init__(self): self._x = random.randint(0,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru