• Create Account

# help in Scaling in OpenGl

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

11 replies to this topic

### #14four4  Members   -  Reputation: 104

Like
0Likes
Like

Posted 11 April 2014 - 07:32 AM

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

### #2DiegoSLTS  Members   -  Reputation: 2113

Like
0Likes
Like

Posted 11 April 2014 - 07:55 AM

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, 11 April 2014 - 07:57 AM.

### #34four4  Members   -  Reputation: 104

Like
0Likes
Like

Posted 11 April 2014 - 10:43 AM

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?

### #4DiegoSLTS  Members   -  Reputation: 2113

Like
0Likes
Like

Posted 11 April 2014 - 10:58 AM

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.

### #54four4  Members   -  Reputation: 104

Like
0Likes
Like

Posted 18 April 2014 - 06:37 AM

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.

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??

### #6haegarr  Crossbones+   -  Reputation: 7158

Like
0Likes
Like

Posted 18 April 2014 - 07:48 AM

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.

### #74four4  Members   -  Reputation: 104

Like
0Likes
Like

Posted 18 April 2014 - 08:12 AM

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!

### #84four4  Members   -  Reputation: 104

Like
0Likes
Like

Posted 18 April 2014 - 08:20 AM

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 .

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 !

### #9haegarr  Crossbones+   -  Reputation: 7158

Like
0Likes
Like

Posted 18 April 2014 - 08:54 AM

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.

### #104four4  Members   -  Reputation: 104

Like
0Likes
Like

Posted 18 April 2014 - 09:45 AM

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

### #11haegarr  Crossbones+   -  Reputation: 7158

Like
0Likes
Like

Posted 18 April 2014 - 10:12 AM

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

### #124four4  Members   -  Reputation: 104

Like
0Likes
Like

Posted 02 May 2014 - 11:47 AM

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

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

PARTNERS