[Unity] Supporting Voxel Rotation

Started by
5 comments, last by swiftcoder 8 years, 2 months ago

In Unity, I've been working on procedurally generated planets made out of cubes. After a long time of testing and tweaking, I have it pretty much where I want it. The problem is, I want these planets to move around a star, which works okay, but I also want these planets to spin. In my code I use the position of where a raycast hits to find the block that would be built / broken. When rotating, though, there is no way for the planet to know that its rotated, meaning when you try to break a block on one side, it still thinks your breaking blocks on wherever that was originally. Is there any way to have it track its own rotation and use that to figure out (accurately) which block is being chosen? Or do I have to approach the problem from another angle?

Current method of replacing blocks:


    public void SetBlock(Vector3 pos, Block block)
    {

        float x = pos.x;
        float y = pos.y;
        float z = pos.z;

        x = Mathf.RoundToInt(x);
        y = Mathf.RoundToInt(y);
        z = Mathf.RoundToInt(z);

        x = x - this.transform.position.x;
        y = y - this.transform.position.y;
        z = z - this.transform.position.z;

        pos = new Vector3(x, y, z);

        blocks[(int)pos.x, (int)pos.y, (int)pos.z] = block;


        UpdatePlanet();

    }

Thanks in advance!

I'm making an open source voxel space game called V0xel_Sp4ce! Help me out with the repository here: https://github.com/SpikeViper/V0xel_Sp4ce

Advertisement
Use the transform class to transform the point. It will handle the rotation for you.


    public void SetBlock(Vector3 pos, Block block)
    {
        Vector3 localPos = this.transform.InverseTransformPoint(pos);
        float x = localPos.x;
        float y = localPos.y;
        float z = localPos.z;

        x = Mathf.RoundToInt(x);
        y = Mathf.RoundToInt(y);
        z = Mathf.RoundToInt(z);

        pos = new Vector3(x, y, z);

        blocks[(int)pos.x, (int)pos.y, (int)pos.z] = block;


        UpdatePlanet();

    }
My current game project Platform RPG

Or, more likely, what you want to do is transform the *ray* before you cast it, rather than transforming the point of intersection (unless the planet is a perfect spheere, these two things are not equivalent).

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]

HappyCoder, what you said works 50% - but half the time it picks the wrong block, 1 or two away from where it was hit. SwiftCoder, how exactly would I transform the way? I'm planning on multiple planets, so not all of them will be rotated the same way.

I'm making an open source voxel space game called V0xel_Sp4ce! Help me out with the repository here: https://github.com/SpikeViper/V0xel_Sp4ce


SwiftCoder, how exactly would I transform the way? I'm planning on multiple planets, so not all of them will be rotated the same way.

You have to raycast against each planet individually, but that shouldn't be an issue (do planets intersect each other?).

Then just use Transform.TransformPoint() to transform the ray origin into planet space, and Transform.TransformDirection() to transform the directio into planet space.

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]

How exactly would I transform the ray to the planet's transform before it knows which planet it is going to hit? Sorry if im not understanding, I haven't done much work with positions and rotations in the past.

I'm making an open source voxel space game called V0xel_Sp4ce! Help me out with the repository here: https://github.com/SpikeViper/V0xel_Sp4ce


How exactly would I transform the ray to the planet's transform before it knows which planet it is going to hit? Sorry if im not understanding, I haven't done much work with positions and rotations in the past.

You would perform a preliminary raycast against each planet's bounding sphere to see which one it hits.

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]

This topic is closed to new replies.

Advertisement