• Advertisement
  • Popular Tags

  • Popular Now

  • Advertisement
  • Similar Content

    • By Fadey Duh
      Good evening everyone!

      I was wondering if there is something equivalent of  GL_NV_blend_equation_advanced for AMD?
      Basically I'm trying to find more compatible version of it.

      Thank you!
    • By Jens Eckervogt
      Hello guys, 
       
      Please tell me! 
      How do I know? Why does wavefront not show for me?
      I already checked I have non errors yet.
      using OpenTK; using System.Collections.Generic; using System.IO; using System.Text; namespace Tutorial_08.net.sourceskyboxer { public class WaveFrontLoader { private static List<Vector3> inPositions; private static List<Vector2> inTexcoords; private static List<Vector3> inNormals; private static List<float> positions; private static List<float> texcoords; private static List<int> indices; public static RawModel LoadObjModel(string filename, Loader loader) { inPositions = new List<Vector3>(); inTexcoords = new List<Vector2>(); inNormals = new List<Vector3>(); positions = new List<float>(); texcoords = new List<float>(); indices = new List<int>(); int nextIdx = 0; using (var reader = new StreamReader(File.Open("Contents/" + filename + ".obj", FileMode.Open), Encoding.UTF8)) { string line = reader.ReadLine(); int i = reader.Read(); while (true) { string[] currentLine = line.Split(); if (currentLine[0] == "v") { Vector3 pos = new Vector3(float.Parse(currentLine[1]), float.Parse(currentLine[2]), float.Parse(currentLine[3])); inPositions.Add(pos); if (currentLine[1] == "t") { Vector2 tex = new Vector2(float.Parse(currentLine[1]), float.Parse(currentLine[2])); inTexcoords.Add(tex); } if (currentLine[1] == "n") { Vector3 nom = new Vector3(float.Parse(currentLine[1]), float.Parse(currentLine[2]), float.Parse(currentLine[3])); inNormals.Add(nom); } } if (currentLine[0] == "f") { Vector3 pos = inPositions[0]; positions.Add(pos.X); positions.Add(pos.Y); positions.Add(pos.Z); Vector2 tc = inTexcoords[0]; texcoords.Add(tc.X); texcoords.Add(tc.Y); indices.Add(nextIdx); ++nextIdx; } reader.Close(); return loader.loadToVAO(positions.ToArray(), texcoords.ToArray(), indices.ToArray()); } } } } } And It have tried other method but it can't show for me.  I am mad now. Because any OpenTK developers won't help me.
      Please help me how do I fix.

      And my download (mega.nz) should it is original but I tried no success...
      - Add blend source and png file here I have tried tried,.....  
       
      PS: Why is our community not active? I wait very longer. Stop to lie me!
      Thanks !
    • By codelyoko373
      I wasn't sure if this would be the right place for a topic like this so sorry if it isn't.
      I'm currently working on a project for Uni using FreeGLUT to make a simple solar system simulation. I've got to the point where I've implemented all the planets and have used a Scene Graph to link them all together. The issue I'm having with now though is basically the planets and moons orbit correctly at their own orbit speeds.
      I'm not really experienced with using matrices for stuff like this so It's likely why I can't figure out how exactly to get it working. This is where I'm applying the transformation matrices, as well as pushing and popping them. This is within the Render function that every planet including the sun and moons will have and run.
      if (tag != "Sun") { glRotatef(orbitAngle, orbitRotation.X, orbitRotation.Y, orbitRotation.Z); } glPushMatrix(); glTranslatef(position.X, position.Y, position.Z); glRotatef(rotationAngle, rotation.X, rotation.Y, rotation.Z); glScalef(scale.X, scale.Y, scale.Z); glDrawElements(GL_TRIANGLES, mesh->indiceCount, GL_UNSIGNED_SHORT, mesh->indices); if (tag != "Sun") { glPopMatrix(); } The "If(tag != "Sun")" parts are my attempts are getting the planets to orbit correctly though it likely isn't the way I'm meant to be doing it. So I was wondering if someone would be able to help me? As I really don't have an idea on what I would do to get it working. Using the if statement is truthfully the closest I've got to it working but there are still weird effects like the planets orbiting faster then they should depending on the number of planets actually be updated/rendered.
    • By Jens Eckervogt
      Hello everyone, 
      I have problem with texture
      using System; using OpenTK; using OpenTK.Input; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL4; using System.Drawing; using System.Reflection; namespace Tutorial_05 { class Game : GameWindow { private static int WIDTH = 1200; private static int HEIGHT = 720; private static KeyboardState keyState; private int vaoID; private int vboID; private int iboID; private Vector3[] vertices = { new Vector3(-0.5f, 0.5f, 0.0f), // V0 new Vector3(-0.5f, -0.5f, 0.0f), // V1 new Vector3(0.5f, -0.5f, 0.0f), // V2 new Vector3(0.5f, 0.5f, 0.0f) // V3 }; private Vector2[] texcoords = { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0) }; private int[] indices = { 0, 1, 3, 3, 1, 2 }; private string vertsrc = @"#version 450 core in vec3 position; in vec2 textureCoords; out vec2 pass_textureCoords; void main(void) { gl_Position = vec4(position, 1.0); pass_textureCoords = textureCoords; }"; private string fragsrc = @"#version 450 core in vec2 pass_textureCoords; out vec4 out_color; uniform sampler2D textureSampler; void main(void) { out_color = texture(textureSampler, pass_textureCoords); }"; private int programID; private int vertexShaderID; private int fragmentShaderID; private int textureID; private Bitmap texsrc; public Game() : base(WIDTH, HEIGHT, GraphicsMode.Default, "Tutorial 05 - Texturing", GameWindowFlags.Default, DisplayDevice.Default, 4, 5, GraphicsContextFlags.Default) { } protected override void OnLoad(EventArgs e) { base.OnLoad(e); CursorVisible = true; GL.GenVertexArrays(1, out vaoID); GL.BindVertexArray(vaoID); GL.GenBuffers(1, out vboID); GL.BindBuffer(BufferTarget.ArrayBuffer, vboID); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * Vector3.SizeInBytes), vertices, BufferUsageHint.StaticDraw); GL.GenBuffers(1, out iboID); GL.BindBuffer(BufferTarget.ElementArrayBuffer, iboID); GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(indices.Length * sizeof(int)), indices, BufferUsageHint.StaticDraw); vertexShaderID = GL.CreateShader(ShaderType.VertexShader); GL.ShaderSource(vertexShaderID, vertsrc); GL.CompileShader(vertexShaderID); fragmentShaderID = GL.CreateShader(ShaderType.FragmentShader); GL.ShaderSource(fragmentShaderID, fragsrc); GL.CompileShader(fragmentShaderID); programID = GL.CreateProgram(); GL.AttachShader(programID, vertexShaderID); GL.AttachShader(programID, fragmentShaderID); GL.LinkProgram(programID); // Loading texture from embedded resource texsrc = new Bitmap(Assembly.GetEntryAssembly().GetManifestResourceStream("Tutorial_05.example.png")); textureID = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, textureID); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)All.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Linear); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, texsrc.Width, texsrc.Height, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); System.Drawing.Imaging.BitmapData bitmap_data = texsrc.LockBits(new Rectangle(0, 0, texsrc.Width, texsrc.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb); GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, texsrc.Width, texsrc.Height, PixelFormat.Bgra, PixelType.UnsignedByte, bitmap_data.Scan0); texsrc.UnlockBits(bitmap_data); GL.Enable(EnableCap.Texture2D); GL.BufferData(BufferTarget.TextureBuffer, (IntPtr)(texcoords.Length * Vector2.SizeInBytes), texcoords, BufferUsageHint.StaticDraw); GL.BindAttribLocation(programID, 0, "position"); GL.BindAttribLocation(programID, 1, "textureCoords"); } protected override void OnResize(EventArgs e) { base.OnResize(e); GL.Viewport(0, 0, ClientRectangle.Width, ClientRectangle.Height); } protected override void OnUpdateFrame(FrameEventArgs e) { base.OnUpdateFrame(e); keyState = Keyboard.GetState(); if (keyState.IsKeyDown(Key.Escape)) { Exit(); } } protected override void OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e); // Prepare for background GL.Clear(ClearBufferMask.ColorBufferBit); GL.ClearColor(Color4.Red); // Draw traingles GL.EnableVertexAttribArray(0); GL.EnableVertexAttribArray(1); GL.BindVertexArray(vaoID); GL.UseProgram(programID); GL.BindBuffer(BufferTarget.ArrayBuffer, vboID); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, IntPtr.Zero); GL.ActiveTexture(TextureUnit.Texture0); GL.BindTexture(TextureTarget.Texture3D, textureID); GL.BindBuffer(BufferTarget.ElementArrayBuffer, iboID); GL.DrawElements(BeginMode.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0); GL.DisableVertexAttribArray(0); GL.DisableVertexAttribArray(1); SwapBuffers(); } protected override void OnClosed(EventArgs e) { base.OnClosed(e); GL.DeleteVertexArray(vaoID); GL.DeleteBuffer(vboID); } } } I can not remember where do I add GL.Uniform2();
    • By Jens Eckervogt
      Hello everyone
      For @80bserver8 nice job - I have found Google search. How did you port from Javascript WebGL to C# OpenTK.?
      I have been searched Google but it shows f***ing Unity 3D. I really want know how do I understand I want start with OpenTK But I want know where is porting of Javascript and C#?
       
      Thanks!
  • Advertisement
  • Advertisement
Sign in to follow this  

OpenGL How to find the center of a modelview matrix?

This topic is 746 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Ok, guys, I have 1 stupid question. But first some introduction. I'm reading that "Beginning OpenGL Game Programming" book because it's written by some smart foos from gamedev.net. The thing that I don't understand in particular is this: (don't read the whole stuff if you don't have time)

This is from the book:

 

"Using the modelview matrix stack essentially allows you to transform from one coordinate

system to another while being able to revert back to the original coordinate system.
For instance, if we position ourselves at the point (10, 5, 7), and we then push the current
modelview matrix onto the current stack, then our current transformation matrix is reset
to the local coordinate system centered around the point (10, 5, 7). This means that any
transformations we do are now based on the coordinate system at (10, 5, 7). So if we then
translate 10 units down the positive x axis with glTranslate(10.0, 0.0, 0.0), we are at the
position (10, 0, 0) in the current transformation matrix, but in the world we are positioned
at (20, 5, 7).When the matrix stack is popped, we revert back to the original transformation
matrix and therefore the original coordinate system, which means we are again

positioned at (10, 5, 7)."

 

The Question: If I have 1 object which is made by 3 vectors. E.g. vector1 = [ 2, 2, 1 ], vector2 = [ 3, 3, 1 ], vector3 = [ 4, 4, 1 ]. We are talking world coordinates here. Now the local matrix is this: (it's like the world matrix because I haven't pushed or popped or moved anything)

[                 ]
[  x  y  z  w  ]

[  2, 2, 1, 1  ]
[  3, 3, 1, 1  ]
[  4, 4, 1, 1  ]

[                 ]
( this means "big brackets" ).

( I need "w" for the translation below ).
So the vectors are in a certain position from the origin (center of the world) .Then I decide to multiply that local / world matrix by some translation matrix, for example, glTranslate( z by 10 ) and push the matrix onto the stack, then how the heck the transformation matrix gets reset to the local coordinate matrix. First I thought that "reset" means glLoadIdentity(), but all this does is set 1s to the diagonal numbers, which will set these particular vectors on all the wrong places, so it's not that. The most logical solution is to see where the center of the object was translated to after the glTranslate and to construct the model/local/whatever matrix based on that center, but how exactly this stuff happens, and how this center is calculated, I don't know.

    After the translation, the matrix is like this:

[               ]

[  x, y,  z   ]
[  2, 2, 11  ]
[  3, 3, 11  ]
[  4, 4, 11  ]

[               ]

 

Now what does this "reset to local coord. system" means?

Give me some basic explanation here, because I feel like I'm doing magic when I call these push and pop functions. How this change of coordinate systems happens???

Edited by Heelp

Share this post


Link to post
Share on other sites
Advertisement

Imagine a stack of matrices, in this case the "model_view" matrix stack activated with a call to glMatrixMode()

<Top>
[matrix1]
[matrix0]
<bottom>
-----------

glPushMatrix() copies the matrix on the top, and then makes it the new top

<Top>
[matrix1copy]
[matrix1]
[matrix0]
<bottom>
-----------

this essentially saves matrix1 (any transforms youve done) and creates a copy, which you might then follow with a call that modifies the top matrix further, such as

glTranslate*() -> builds a translation matrix and multiplies it into the top of the current stack (the matrix 1 copy) further transforming matrix 1
glScale() -> same thing, but a scale matrix is multipled into top
glRotate()  -> same thing, but a rotation matrix it multipled into top
glLoadIdentity() -> clear top to identity
glMultMatrix() -> you provide the matrix already built

<Top>
[matrix1copy] *= Trans|Scale|Rot Matrix
[matrix1]
[matrix0]
<bottom>
-----------

now you draw, its use the top, then when you are done drawing, you call PopMatrix(), which removes the top and goes back to the original

<Top>
[matrix1]
[matrix0]
<bottom>
-----------

simple example, want to draw an object at 10 down +x, at 20 down +x, and 5 up +y

<Top>
[matrix0.identity]
<bottom>
-----------

PushMatrix()

<Top>
[matrix0.identity] <- glPushMatrix()
[matrix0.identity]
<bottom>
-----------

<Top>
[matrix0.(10, 0, 0)] <- PushMatrix(), *= glTranslate(10, 0, 0), now draws at 10 down x
[matrix0.identity]
<bottom>
-----------

<Top>
[matrix0.(20, 0, 0)] <- PushMatrix(), *= glTranslate(10, 0, 0), now draws at 20 down x
[matrix0.(10, 0, 0)]
[matrix0.identity] <- drawing now draws at origin
<bottom>
-----------

PopMatrix(), PopMatrix()

<Top>
[matrix0.identity] <- drawing now draws at origin
<bottom>
-----------

<Top>
[matrix0.(0, 5, 0)] <- PushMatrix(), *= glTranslate(0, 5, 0), now draws at 5 up y
[matrix0.identity]
<bottom>
-----------

thats the general idea anyway, think of pushmatrix as transform save point, a fork in the road you might want to come back to before applying more transforms.
Its the model view matrix because you generally put the view matrix (inverse of the cameras matrix) at the bottom (first) which brings an objects model matrix (world matrix)
into the cameras "view space". These are all old opengl calls, but the idea can still be important to understand.

Edited by NumberXaero

Share this post


Link to post
Share on other sites

Ok, so translation goes before drawing the vertices, the guys who wrote OpenGL decided that way, ok. But when does the multiplication of matrices take place? For example, first I use glTranslate( x by 10 ), then I draw 70 vertices. How does the program know that I stopped drawing and that it should multiply the vertices matrix by the translation matrix???

And one more thing: You said that the top matrix onto the stack doesn't get accessed directly, but is copied. So when I use pushMatrix(), my main matrix gets copied onto the top of the matrix stack, BUT THE VALUES of my MAIN matrix remain the same, they are not resetted just copied( but the guy in the book says that it gets reset??? ) and when I use popMatrix(), the top matrix on the stack replaces the values of my current/main matrix.

Edited by Heelp

Share this post


Link to post
Share on other sites

I checked it. glPushMatrix() doesn't do anything to the current matrix, except just copying it onto the stack, so no reset stuff happens, you were right. If you want to reset, you have to do it by yourself with glLoadIdentity. So pushmatrix just saves some numbers onto the stack for you, so you don't have to do it manually, and popmatrix just gets some numbers for you, nothing complicated.... and the guy on the book was sooo wrong...., cuz there is no change/reset/whatever in coordinate systems, and the reason glTranslate() is cumulative is not because you reset the matrix to local coordinates, glTranslate is cumulative because it operates on only 1 matrix (the current one), it just multiplies "w" by the value you specify and adds it to x,y or z, again you need to specify where to add it to. And when you call glTranslate for the 2nd, 3rd or 4th time, it operates on the matrix that was already changed by the previous translations. That's what 'cumulative' means.( right??)
 Hey, man, thanks a lot for the answer, really, I had it all messed up in my head. Big thanks for your help. I drawed all my cubes your way and they are all in the right position now.

Edited by Heelp

Share this post


Link to post
Share on other sites

And 1 last very short question.

The Question:

Is there a local coordinate space in OpenGL???
I think the answer is No, because all the vertices' positions are stored RELATIVE to the WORLD matrix, doesn't matter if you push or pop or clear the matrix, if the vertex says [ 5, 0, 0 ], it means that it is x=5 from the origin, and nothing else matters, right???

Edited by Heelp

Share this post


Link to post
Share on other sites

To make things simpler, everything is always in world coordinates. Anytime a matrix is present it takes the points in your 3d model as vectors and stretches those vectors to point somewhere else and gives you new vectors. Any matrix operations afterwords are applied to those new vectors.

 

If you have played Zelda, or any game similar. You might have a light or creature that circles around a main character. It is circling relative to the player. Keyword relative, so you need a vector relative to the player to happen first. So translate some distance from the origin of the world (treating 0,0,0 as the characters position even though he is thousands of units from the origin).  Apply your rotation treating the origin as the player, and then finally translate to the players position.

 

If you don't think locally you might translate to the player first, and then apply rotation, but every rotation takes vectors from 0,0,0 and rotates them. So if you translate thousands of units away first, you are then rotating vectors around the origin that are thousands of units long (centered around the origin).

 

If that clears anything up. Local matrix is simply more of a logical thing.

Share this post


Link to post
Share on other sites

That's exactly what I needed to hear. Thanks for the answer. :cool:

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement