Sign in to follow this  
4four4

OpenGL help in Scaling in OpenGl

Recommended Posts

4four4    104

hi 

 

how r u guys

 

I am beginner in   opengl

 

I am solving assignment that is saying to use 2  function to draw house....

and put this house in  another function 

 

and then  call this function 3 times to draw house  as original , draw another house  reduced down to ¾  of the original  and finally draw third house 

scaled up to 5/4 of the original one

 

 

I have solved the first part and finish draw the original ,stop in the part of scaling reduced by ¾ !!!and scale up 5/4 

I  know that I have to use scale but How I can make it 3 over 4  the size of the original  and  scale up 5/4  ,how I choose the suitable values for x and y!!!

 

Can you help me because I am stuck in this point!!!I had reading book and search the Internet from  yesterday!!

 

Note that the house is of 2 D not 3D

Share this post


Link to post
Share on other sites
DiegoSLTS    2113

If the model is already scaled to 3/4 of the original then multiply it by 4/3 to go back to the original size and then by 5/4. If you want to do it in one step just chain the multiplications, 4/3*5/4 = 5/3.

 

Anyway, it's a good practice to always undo your transformations after drawing something (if there are no childs to be affected too), so the 4/3 scale should be there even if you don't plan to draw another house.

 

EDIT: 3/4 is the same as 0.75, so for the glScalef call should be glScalef(0.75,0.75,1).

Edited by DiegoSLTS

Share this post


Link to post
Share on other sites
4four4    104

If the model is already scaled to 3/4 of the original then multiply it by 4/3 to go back to the original size and then by 5/4. If you want to do it in one step just chain the multiplications, 4/3*5/4 = 5/3.

 

Anyway, it's a good practice to always undo your transformations after drawing something (if there are no childs to be affected too), so the 4/3 scale should be there even if you don't plan to draw another house.

 

EDIT: 3/4 is the same as 0.75, so for the glScalef call should be glScalef(0.75,0.75,1).

 

 

the original is of specific size and I want to  reduce it by 3/4 

 

also I want also the original to scale by 5/4 to make it bigger 

 

 

I think the glScale is the suitable one to use

 

,so to reduce the original  based on your answer  I do like this

glScale(.75,.75,1)

 

and to make big house I do like this

glScale(1.25,1.25,1)

 

 

Is that right?

 

 

Thank you for your replay 

Share this post


Link to post
Share on other sites
DiegoSLTS    2113

If you need to scale at 5/4 of the original size, you first need to undo the previous transformation of 3/4.

 

If you do only those calls and draw the house after each, you'll get a house 3/4 of the original size and then a house 5/4 of the small size. You want to scale back to the original size with a 4/3 (1.333..) scaling factor before the 1.25 one. If you already managed to undo all the transformations before each drawing of the house ignore the 4/3 scaling.

Share this post


Link to post
Share on other sites
4four4    104

If you need to scale at 5/4 of the original size, you first need to undo the previous transformation of 3/4.

 

If you do only those calls and draw the house after each, you'll get a house 3/4 of the original size and then a house 5/4 of the small size. You want to scale back to the original size with a 4/3 (1.333..) scaling factor before the 1.25 one. If you already managed to undo all the transformations before each drawing of the house ignore the 4/3 scaling.

Thank you for your interaction 

 

i want to draw house which is smaller than the original by 3/4:

I had used glscale(.75,.75,1) ,,,,1 because I use 2D

 

and I want to draw another house which is bigger than the original by 5/4

I had used glscale(1.25,1.25,1) ,,,,1 because I use 2D

 

Is this right??

Share this post


Link to post
Share on other sites
haegarr    7372

I wonder why in the days where OpenGL 4.3 is out and 4.4 available at least as specification, still stuff of OpenGL 2.1 is allowed to be used in an assignment. But nevertheless ...

 


i want to draw house which is smaller than the original by 3/4:
I had used glscale(.75,.75,1) ,,,,1 because I use 2D
 
and I want to draw another house which is bigger than the original by 5/4
I had used glscale(1.25,1.25,1) ,,,,1 because I use 2D
 
Is this right??
In principle, yes. But you need to restrict their effect onto the respective model (or else consider an undo as suggested by DiegoSLTS above). Read about glPushMatrix and glPopMatrix to learn how to separate model transforms for different models. Notice however that the view transform is (usually) the same for all models, so that the correct moment of working with glPushMatrix and glPopMatrix is behind composing the view transform.

 

Another aspect is the order of glScale and any other transform you apply to the same house model. For example, the current house should be translated also just to not overlap with one of the other house drawings. If you choose the wrong order, then the scaling will not appear as you want.

Share this post


Link to post
Share on other sites
4four4    104

If you need to scale at 5/4 of the original size, you first need to undo the previous transformation of 3/4.

 

If you do only those calls and draw the house after each, you'll get a house 3/4 of the original size and then a house 5/4 of the small size. You want to scale back to the original size with a 4/3 (1.333..) scaling factor before the 1.25 one. If you already managed to undo all the transformations before each drawing of the house ignore the 4/3 scaling.

 

 no need to undo any  previous transformation coz I used popMatrix() and pushMartix() ,they will do the work!

Share this post


Link to post
Share on other sites
4four4    104

I wonder why in the days where OpenGL 4.3 is out and 4.4 available at least as specification, still stuff of OpenGL 2.1 is allowed to be used in an assignment. But nevertheless ...

 

 

 


i want to draw house which is smaller than the original by 3/4:
I had used glscale(.75,.75,1) ,,,,1 because I use 2D
 
and I want to draw another house which is bigger than the original by 5/4
I had used glscale(1.25,1.25,1) ,,,,1 because I use 2D
 
Is this right??
In principle, yes. But you need to restrict their effect onto the respective model (or else consider an undo as suggested by DiegoSLTS above). Read about glPushMatrix and glPopMatrix to learn how to separate model transforms for different models. Notice however that the view transform is (usually) the same for all models, so that the correct moment of working with glPushMatrix and glPopMatrix is behind composing the view transform.

 

Another aspect is the order of glScale and any other transform you apply to the same house model. For example, the current house should be translated also just to not overlap with one of the other house drawings. If you choose the wrong order, then the scaling will not appear as you want.

 

 

 

 

ya ,i use glPushMatrix and glPopMatrix 

 

about the second point i draw the small house at the right of the original and the big to the left of  it .

 

But I am asking about scaling ,if it is right?,,,

 

i want to understand another point ,when I say 3/4 of the original ,that mean the x will be 3/4 of the original and also the y will be 3/4 of the original !

 

Share this post


Link to post
Share on other sites
haegarr    7372


But I am asking about scaling ,if it is right?,,,

As already said: "in principal, yes". And since you actually use push/pop matrix, its really okay.

 


i want to understand another point ,when I say 3/4 of the original ,that mean the x will be 3/4 of the original and also the y will be 3/4 of the original !

That isn't a question. Do you want a confirmation of what "scale by 3/4" means exactly?

 

Applying the routine glScale( 0.75, 0.75, 1 ) generates a matrix that scales the model in each axis separately, so that the lengths in direction of the principal x and y axes will be reduced to 3/4, and along the z direction nothing is changed. Because of the separation, the area covered by the 2D model will be 9/16-th and hence less than 3/4, of course. It isn't clear whether length or area scaling by 3/4 is meant when reading the OP.

Share this post


Link to post
Share on other sites
4four4    104

 


But I am asking about scaling ,if it is right?,,,

As already said: "in principal, yes". And since you actually use push/pop matrix, its really okay.

 

 

 


i want to understand another point ,when I say 3/4 of the original ,that mean the x will be 3/4 of the original and also the y will be 3/4 of the original !

That isn't a question. Do you want a confirmation of what "scale by 3/4" means exactly?

 

Applying the routine glScale( 0.75, 0.75, 1 ) generates a matrix that scales the model in each axis separately, so that the lengths in direction of the principal x and y axes will be reduced to 3/4, and along the z direction nothing is changed. Because of the separation, the area covered by the 2D model will be 9/16-th and hence less than 3/4, of course. It isn't clear whether length or area scaling by 3/4 is meant when reading the OP.

 

aha !

 

maybe I didn't know how to formulate the question !but that what I meant exactly!

he area covered by the 2D model will be 9/16-th 

9 come form the scaling in x-axes and y-axes and also the y!that what I want  to understand

 

thanks a lot

Share this post


Link to post
Share on other sites
haegarr    7372


9 come form the scaling in x-axes and y-axes and also the y!that what I want  to understand

Err, well, the factor comes from the separate scalings and the fact that an area is two-dimenional: The area is the product of the two lengths (assuming they are orthogonally oriented, like principal x and y axes are), so when the original area is

     A := x * y

and the lengths are scaled by 3/4, the resulting area is

     A' := ( 3/4 * x ) * ( 3/4 * y ) = ( 3/4 * 3/4 ) * ( x * y ) = 9/16 * A 

Share this post


Link to post
Share on other sites
4four4    104

 


9 come form the scaling in x-axes and y-axes and also the y!that what I want  to understand

Err, well, the factor comes from the separate scalings and the fact that an area is two-dimenional: The area is the product of the two lengths (assuming they are orthogonally oriented, like principal x and y axes are), so when the original area is

     A := x * y

and the lengths are scaled by 3/4, the resulting area is

     A' := ( 3/4 * x ) * ( 3/4 * y ) = ( 3/4 * 3/4 ) * ( x * y ) = 9/16 * A 

 

 

Ok!

Thank you alot

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Similar Content

    • By Zaphyk
      I am developing my engine using the OpenGL 3.3 compatibility profile. It runs as expected on my NVIDIA card and on my Intel Card however when I tried it on an AMD setup it ran 3 times worse than on the other setups. Could this be a AMD driver thing or is this probably a problem with my OGL code? Could a different code standard create such bad performance?
    • By Kjell Andersson
      I'm trying to get some legacy OpenGL code to run with a shader pipeline,
      The legacy code uses glVertexPointer(), glColorPointer(), glNormalPointer() and glTexCoordPointer() to supply the vertex information.
      I know that it should be using setVertexAttribPointer() etc to clearly define the layout but that is not an option right now since the legacy code can't be modified to that extent.
      I've got a version 330 vertex shader to somewhat work:
      #version 330 uniform mat4 osg_ModelViewProjectionMatrix; uniform mat4 osg_ModelViewMatrix; layout(location = 0) in vec4 Vertex; layout(location = 2) in vec4 Normal; // Velocity layout(location = 3) in vec3 TexCoord; // TODO: is this the right layout location? out VertexData { vec4 color; vec3 velocity; float size; } VertexOut; void main(void) { vec4 p0 = Vertex; vec4 p1 = Vertex + vec4(Normal.x, Normal.y, Normal.z, 0.0f); vec3 velocity = (osg_ModelViewProjectionMatrix * p1 - osg_ModelViewProjectionMatrix * p0).xyz; VertexOut.velocity = velocity; VertexOut.size = TexCoord.y; gl_Position = osg_ModelViewMatrix * Vertex; } What works is the Vertex and Normal information that the legacy C++ OpenGL code seem to provide in layout location 0 and 2. This is fine.
      What I'm not getting to work is the TexCoord information that is supplied by a glTexCoordPointer() call in C++.
      Question:
      What layout location is the old standard pipeline using for glTexCoordPointer()? Or is this undefined?
       
      Side note: I'm trying to get an OpenSceneGraph 3.4.0 particle system to use custom vertex, geometry and fragment shaders for rendering the particles.
    • By markshaw001
      Hi i am new to this forum  i wanted to ask for help from all of you i want to generate real time terrain using a 32 bit heightmap i am good at c++ and have started learning Opengl as i am very interested in making landscapes in opengl i have looked around the internet for help about this topic but i am not getting the hang of the concepts and what they are doing can some here suggests me some good resources for making terrain engine please for example like tutorials,books etc so that i can understand the whole concept of terrain generation.
       
    • By KarimIO
      Hey guys. I'm trying to get my application to work on my Nvidia GTX 970 desktop. It currently works on my Intel HD 3000 laptop, but on the desktop, every bind textures specifically from framebuffers, I get half a second of lag. This is done 4 times as I have three RGBA textures and one depth 32F buffer. I tried to use debugging software for the first time - RenderDoc only shows SwapBuffers() and no OGL calls, while Nvidia Nsight crashes upon execution, so neither are helpful. Without binding it runs regularly. This does not happen with non-framebuffer binds.
      GLFramebuffer::GLFramebuffer(FramebufferCreateInfo createInfo) { glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); textures = new GLuint[createInfo.numColorTargets]; glGenTextures(createInfo.numColorTargets, textures); GLenum *DrawBuffers = new GLenum[createInfo.numColorTargets]; for (uint32_t i = 0; i < createInfo.numColorTargets; i++) { glBindTexture(GL_TEXTURE_2D, textures[i]); GLint internalFormat; GLenum format; TranslateFormats(createInfo.colorFormats[i], format, internalFormat); // returns GL_RGBA and GL_RGBA glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, createInfo.width, createInfo.height, 0, format, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); DrawBuffers[i] = GL_COLOR_ATTACHMENT0 + i; glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, textures[i], 0); } if (createInfo.depthFormat != FORMAT_DEPTH_NONE) { GLenum depthFormat; switch (createInfo.depthFormat) { case FORMAT_DEPTH_16: depthFormat = GL_DEPTH_COMPONENT16; break; case FORMAT_DEPTH_24: depthFormat = GL_DEPTH_COMPONENT24; break; case FORMAT_DEPTH_32: depthFormat = GL_DEPTH_COMPONENT32; break; case FORMAT_DEPTH_24_STENCIL_8: depthFormat = GL_DEPTH24_STENCIL8; break; case FORMAT_DEPTH_32_STENCIL_8: depthFormat = GL_DEPTH32F_STENCIL8; break; } glGenTextures(1, &depthrenderbuffer); glBindTexture(GL_TEXTURE_2D, depthrenderbuffer); glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, createInfo.width, createInfo.height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthrenderbuffer, 0); } if (createInfo.numColorTargets > 0) glDrawBuffers(createInfo.numColorTargets, DrawBuffers); else glDrawBuffer(GL_NONE); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer Incomplete\n"; glBindFramebuffer(GL_FRAMEBUFFER, 0); width = createInfo.width; height = createInfo.height; } // ... // FBO Creation FramebufferCreateInfo gbufferCI; gbufferCI.colorFormats = gbufferCFs.data(); gbufferCI.depthFormat = FORMAT_DEPTH_32; gbufferCI.numColorTargets = gbufferCFs.size(); gbufferCI.width = engine.settings.resolutionX; gbufferCI.height = engine.settings.resolutionY; gbufferCI.renderPass = nullptr; gbuffer = graphicsWrapper->CreateFramebuffer(gbufferCI); // Bind glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); // Draw here... // Bind to textures glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textures[1]); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, textures[2]); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, depthrenderbuffer); Here is an extract of my code. I can't think of anything else to include. I've really been butting my head into a wall trying to think of a reason but I can think of none and all my research yields nothing. Thanks in advance!
    • By Adrianensis
      Hi everyone, I've shared my 2D Game Engine source code. It's the result of 4 years working on it (and I still continue improving features ) and I want to share with the community. You can see some videos on youtube and some demo gifs on my twitter account.
      This Engine has been developed as End-of-Degree Project and it is coded in Javascript, WebGL and GLSL. The engine is written from scratch.
      This is not a professional engine but it's for learning purposes, so anyone can review the code an learn basis about graphics, physics or game engine architecture. Source code on this GitHub repository.
      I'm available for a good conversation about Game Engine / Graphics Programming
  • Popular Now