Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by TheZenth1 · Mar 22, 2015 at 10:09 AM · sphereplaneplanet

How do you make a sphere from 6 planes?

Hi all,

I have been attempting to create a sphere from 6 planes, so that I may later edit these planes to give the sphere a procedural generated surface (so as to create unique planets).

To take 6 planes and make them into a sphere, I have been using this code:

 public function MakeSphereFromPlanes()
     {
         var positionArr : Vector3[] = [
             new Vector3(0,this.radius,0),
             new Vector3(0,-this.radius,0),
             new Vector3(0,0,this.radius),
             new Vector3(0,0,-this.radius),
             new Vector3(this.radius,0,0),
             new Vector3(-this.radius,0,0)
         ];
 
         var rotationArr : Vector3[] = [
             Vector3.zero,
             Vector3.zero,
             new Vector3(90,0,0),
             new Vector3(90,0,0),
             new Vector3(0,0,90),
             new Vector3(0,0,90)
         ];
 
         for(var p : int = 0;p<6;p++)
         {
             //make 6 planes for the sphere in this loop
             var newPlane : GameObject = GameObject.CreatePrimitive(PrimitiveType.Plane);
             newPlane.transform.localScale = Vector3(this.radius,this.radius,this.radius);
             newPlane.transform.SetParent(this.gameObject.transform);
             newPlane.transform.position = positionArr[p];
             newPlane.transform.eulerAngles = rotationArr[p];
 
             var vertices : Vector3[] = newPlane.GetComponent(MeshFilter).mesh.vertices;
 
             for (var i = 0; i < vertices.Length; i++)
             {
                 vertices[i] = vertices[i].normalized * this.radius;         
             }
             newPlane.GetComponent(MeshFilter).mesh.vertices = vertices;
             newPlane.GetComponent(MeshFilter).mesh.RecalculateNormals();
             newPlane.GetComponent(MeshFilter).mesh.RecalculateBounds();
         }

   }

The issue I am running into is that this code seems to produce this:

alt text

And I am not entirely sure why, or how to get it working. Does anyone have any thoughts on this, or know what I am doing wrong?

sphere-test-image.png (190.3 kB)
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
2
Best Answer

Answer by DiegoSLTS · Mar 22, 2015 at 01:29 PM

I've tested that and fixed it in C#, I hope this helps, it shouldn't be hard to translate it back to UnityScript.

First make sure your planes form a 1x1x1 cube around the origin, only then transform the vertices. You don't need the radius to create the cube, so some of the code can be simplified:

 Vector3[] positionArr = {
             new Vector3(0,0.5f,0),
             new Vector3(0,-0.5f,0),
             new Vector3(0,0,0.5f),
             new Vector3(0,0,-0.5f),
             new Vector3(0.5f,0,0),
             new Vector3(-0.5f,0,0)
         };

and:

 newPlane.transform.localScale = new Vector3(0.1f,0.1f,0.1f);

Also, to create a cube with planes you have to consider the "face" of the planes, you're rotating parallel planes in the same direction, but they should face the opposite direction from each other (note the values and the signs):

 Vector3[] rotationArr = {
             Vector3.zero,
             new Vector3(180,0,0),
             new Vector3(90,0,0),
             new Vector3(-90,0,0),
             new Vector3(0,0,-90),
             new Vector3(0,0,90)
         };

And the last part, when you want to transform a vertex note that you have it's value relative to the plane itself (it's a "local" point), but you need the position of that point in the world. Once you know where is that point in the world you can normalize and stretch the value to match the radius, and then you have to convert it back to local coordinates, since the vertex is still a point of the Plane. So, for each vertex:

 vertices[i] = newPlane.transform.InverseTransformPoint(newPlane.transform.TransformPoint(vertices[i]).normalized * this.radius);

The full script I created looks like this:

 using UnityEngine;
 using System.Collections;
 
 public class PlanesToSphere : MonoBehaviour {
 
     public float radius;
     
     void Start() {
         Vector3[] positionArr = {
             new Vector3(0,0.5f,0),
             new Vector3(0,-0.5f,0),
             new Vector3(0,0,0.5f),
             new Vector3(0,0,-0.5f),
             new Vector3(0.5f,0,0),
             new Vector3(-0.5f,0,0)
         };
         
         Vector3[] rotationArr = {
             Vector3.zero,
             new Vector3(180,0,0),
             new Vector3(90,0,0),
             new Vector3(-90,0,0),
             new Vector3(0,0,-90),
             new Vector3(0,0,90)
         };
         
         for(int p = 0; p<6; p++)
         {
             //make 6 planes for the sphere in this loop
             GameObject newPlane = GameObject.CreatePrimitive(PrimitiveType.Plane);
             newPlane.transform.SetParent(transform);
             newPlane.transform.localScale = new Vector3(0.1f,0.1f,0.1f);
             newPlane.transform.position = positionArr[p];
             newPlane.transform.eulerAngles = rotationArr[p];
             Vector3[] vertices = newPlane.GetComponent<MeshFilter>().mesh.vertices;
             for (var i = 0; i < vertices.Length; i++)
             {
                 vertices[i] = newPlane.transform.InverseTransformPoint(newPlane.transform.TransformPoint(vertices[i]).normalized * this.radius);
             }
             newPlane.GetComponent<MeshFilter>().mesh.vertices = vertices;
             newPlane.GetComponent<MeshFilter>().mesh.RecalculateNormals();
             newPlane.GetComponent<MeshFilter>().mesh.RecalculateBounds();
         }
     }
 }

Just add that script to an empty game object, set the radius in the inspector and press play.

One more advice, try to make complex things in a new scene with the minimium you need for it. It's clear from your script and your screenshot that you're trying to to this sphere thing inside a complex scene with more things going on. It's harder to work that way, and you might end up with references you don't really need.

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image TheZenth1 · Mar 22, 2015 at 01:50 PM 0
Share

Thank you so much! This really helps!

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

2 People are following this question.

avatar image avatar image

Related Questions

How do you create a sphere form 6 planes? 0 Answers

How to place objects from a 2d plane around a sphere? 1 Answer

Rotation Script Changes the Object Axis Inclination Too 2 Answers

IcoSphere vs. Cube Sphere 0 Answers

Implementing a quadtree LOD system to a cube-sphere 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges