Advertisement Jump to content
Sign in to follow this  
Kiel368

Unity Best way of volume selection

This topic is 1762 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

Hi!

I'm writing a sandbox game in Unity 3D based on voxel terrain. I need the player to interact with the world (place/remove blocks).

 

The problem is, that size of the smallest voxel is 6 cm, so placing voxels one-by-one is unacceptable if player wants to build somehthing big. To solve this problem I've created a crafting system, which lets the player create e.g. a 40x5x5 cube of stone.

 

Now, the problem is that player must be able to change the orintation of the created item and I don't know how to achieve this! Do you have any idea how could reorientating look like? Maybe according to mouse movement (but how)? or using keyboard...

 

I've attached a screenshot of what it is like now. Please think of a way how could player reorientate that box in a user-friendly way.

 

Thanks.

Kiel368

Share this post


Link to post
Share on other sites
Advertisement

How about a two-click mechanism? The first click lets you drag a rectangle of blocks over the XZ-plane, the second click scales along the Y-axis. This allows the user to create any combination of blocks.

Share this post


Link to post
Share on other sites

You can allow selecting a single axis at a time and resizing/moving on that axis. These tasks can be done by pressing a key, scrolling the mouse wheel, clicking, dragging, whatever.

 

For rotation you usually have some hard to comprehend system where you can rotate using keys. The user then hits the keys randomly until the object ends up with the correct orientation. You can make this easier by having the keys be fixed to global axes (instead of tied to local object axes). You can also add indicators to tell which key rotates on what axis (hovering thing with the key shown for each axis).

 

You can also have rotation by dragging the object or some GUI surrounding the object with the mouse but you should also have the keyboard version because the mouse tends get slow and annoying after you become a pro.

 

And last, you can implement some automatic detection of optimal positioning based on surroundings, but make sure it doesnt get in the way and randomly change the positioning while the user is trying to manually adjust it.

Share this post


Link to post
Share on other sites

The game Cosmo Bots demonstrated a 2D version of what you're after. It could accurately figure out your intentions through a combination of mouse movement and ray-tracing (I think it would prefer to rotate towards the nearest wall). If you weren't happy with its orientation, you could right-click the mouse to manually rotate it.

 

I think the most intuitive method would be to rotate the volume on the 2D surface of the currently selected block, according to an average mouse direction. This would be done as follows:

  1. Determine the surface normal the mouse cursor is over. For instance, if the mouse is on the top side of a block, the normal would be [0,1,0], where as if the mouse were on the side of a block, the normal would be [1,0,0] etc.
  2. Calculate a normalised directional mouse movement vector in 3D. This could be done by storing, say, the last 30 3D mouse positions in a ring buffer, and calculating the difference between the first and last point.
  3. The normal from step 1) is the axis around which you should rotate the volume selection. Using the mouse direction, you are able to calculate an optimal angle for the volume selection. You'd of course round the angle to 90° steps.
  4. Make sure the volume doesn't intersect with any other blocks, adjust position and angle accordingly.

Does that make any sense? I can create some illustrative images with MineCraft if not...

Edited by TheComet

Share this post


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

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!