Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

I've been bashing my head for the past couple of weeks trying to find a way to help me accomplish, on first look very easy task. So, I got this one object currently made out of 5 cuboids (2 sides, 1 top, 1 bottom, 1 back), this is just for an example, later on there will be whole range of different set ups. Now, the thing is when the user chooses to scale the whole object this is what should happen:

X scale: top and bottom cuboids should get scaled by a scale factor, sides should get moved so they are positioned just like they were before(in this case at both ends of top and bottom cuboids), back should get scaled so it fits like before(if I simply scale it by a scale factor it will leave gaps on each side).

Y scale: sides should get scaled by a scale factor, top and bottom cuboid should get moved, and back should also get scaled.

Z scale: sides, top and bottom cuboids should get scaled, back should get moved.

Hope you can help,


EDIT: So, I've decided to explain the situation once more, this time more detailed(hopefully). I've also made some pictures of how the scaling should look like, where is the problem and the wrong way of scaling.

I this example I will be using a thick walled box, with one face missing, where each wall is made by a cuboid(but later on there will be diffrent shapes of objects, where a one of the face might be roundish, or triangle or even under some angle), scaling will be 2x on X axis.

1.This is how the default object without any scaling applied looks like: http://img856.imageshack.us/img856/4293/defaulttz.png

2.If I scale the whole object(all of the meshes) by some scale factor, the problem becomes that the "thickness" of the object walls also change(which I do not want): http://img822.imageshack.us/img822/9073/wrongwaytoscale.png

3.This is how the correct scaling should look like. Appropriate faces gets caled in this case where the scale is on X axis(top, bottom, back): http://imageshack.us/photo/my-images/163/rightwayxscale1.png/

4.But the scale factor might not be the same for all object all of the times. In this case the back has to get scaled a bit more or it leaves gaps: http://imageshack.us/photo/my-images/9/problemwhenscaling.png/

5.If everything goes well this is how the final object should look like: http://imageshack.us/photo/my-images/856/rightwayxscale2.png/

So, as you have might noticed there are quite a bit of things to look out when scaling. I am asking you, if any of you have any idea on how to accomplish this scaling. I have tried whole bunch of things, from scaling all of the object by the same scale factor, to subtracting and adding sizes to get the right size. But nothing I tried worked, if one mesh got scaled correctly then others didnt.

Donwload the example object.

English is not my first language, so I am really sorry if its hard to understand what I am saying.

share|improve this question
    
Are you wanting the thickness of the "walls" to remain the same? –  Byte56 Dec 15 '12 at 16:21
    
Yes thats right, I forgot to mention that. –  user1806687 Dec 15 '12 at 16:43
    
Your update is pushing your question into the "too localized" realm. It sounds like you're no longer looking for algorithms, but you want code. That's something you'll be unlikely to get. –  Byte56 Dec 16 '12 at 16:13
    
I am just looking for a way to achieve this. –  user1806687 Dec 16 '12 at 18:13
    
I'm sure you are. I've presented that below. It doesn't mean someone is going to write code for you. If you're still unclear about something in my answer, ask about it. –  Byte56 Dec 16 '12 at 18:15
show 2 more comments

1 Answer

You have a few options.

  • Apply a scale matrix to all the vertices that make up all the objects used to create your form. This is a common procedure, I'm sure XNA has something built in for this. This should be your preferred approach. It's the most common and it will produce the results you want. Additionally, it will work for any combination of shapes you make.

  • Scale an invisible box and resize/move your objects to fit around it. Just have six positions that represent each face of a invisible cube. Move those along the axis they represent (top/bottom = y axis, left/right = x axis, front/back = z axis), and have your cuboids make their size and positions match up to the positions. This method would be useful if you wanted to maintain the thickness of your "walls" even after scaling.

    • For example, the top cuboid would use the top position as it's position. It would then use each of the side positions to set its width and height.

EDIT to clarify the second option.

You have 6 positions:

enter image description here

Those positions define the positions and size of the shapes you have attached.

For example, the top cuboid would defined as such:

position = YP
width = XP-XM
height = wallThickness
depth = ZP-ZM

Or the back cuboid would be defined as:

position = ZP
width = XP-XM
height = YP-YM
depth = wallThickness
share|improve this answer
    
I am sorry, I am not really sure what you meant? –  user1806687 Dec 15 '12 at 16:45
    
I could explain the whole thing again, or you can tell me what you're unsure about. –  Byte56 Dec 15 '12 at 17:06
    
How you meant the second thing, with the invisible box thingie –  user1806687 Dec 15 '12 at 17:16
    
First imagine that the right cuboid position is XP, left position = XM, top = YP and so on. You can imagine that re-sizing this box will move the cuboids around, but they'll have gaps. The next step is to just re-size the cuboids to fill the gaps. –  Byte56 Dec 16 '12 at 19:10
2  
OK, you can modify the above algorithm to allow for that. You need to implement something like a scene graph. Where there are parent objects and child objects. The child positions are defined in relation to the parent size/position. For example, you could place the two back cuboids at 25% and 75% of their parent's width. That would adjust them to remain in their relative positions when the parent is re-sized. This is similar to the way 2D GUIs are defined. Where moving the parent around and re-sizing it keeps the elements (buttons, menus, etc.) in their correct positions. –  Byte56 Dec 17 '12 at 19:28
show 8 more comments

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.