Jump to content

[1.8.9] Rendering a circular texture in a sphere-like manner


blahblahbal

Recommended Posts

Alright, so I'm trying to figure out how to render a 16x16 pixel texture of a circle in a way that makes it look like a sphere. This means on the X, Y, and Z planes, as well as on the diagonals. I'm baffled by the way the vanilla arrow renders and I could use some help understanding how that works. I may even be able to figure out my rendering code by myself if I could just understand what the arrow rendering code is doing.

 

This is an example of the texture I'm using.

Link to comment
Share on other sites

Arrows are 3D objects. You will not be able to render a flat texture in such that it appears to be a sphere. The closest you can come is a camera-facing-billboard, like name tags.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

The arrow model still has a texture associated with it.  That doesn't mean it renders it as a single plane though.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Hi

 

The reason that a sphere looks like a sphere, instead of like a circle, is the shading.  A sphere without shading just looks like a circle.

 

The silhouette of a sphere is always a circle regardless of which angle you look at it.  The EntityFX do this by rotating the texture so that it always drawn directly facing the viewer.  Normal Entities don't do that.

 

The entities which are autogenerated from a flat 2D texture are given a "thickness" so that they look 3D.  But that won't make them look round or like a sphere.  Only shading will do that- either by using fancy rendering, or by making your texture shaded i.e. darker at the edges of the circle, lighter in the middle.

 

-TGG

 

Link to comment
Share on other sites

I guess what I meant isn't getting through. I want to draw my flat texture in such a way that it appears to be a sphere; that is, similar to the way the arrow model is made.

 

The arrow model isn't circular, it looks like 3 intersecting planes.

 

Amazing how realistic this looks:

 

0*-YkffDHFfJ6RA1V6.

 

Only....not.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Hi

 

If you're trying to achieve the effect that Draco's picture shows, which is what EntityArrow does, then you can just draw the texture in several different planes like you said.

 

RenderArrow.doRender does that.  For example here

        for (int i = 0; i < 4; ++i)
        {
            GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F);
            GL11.glNormal3f(0.0F, 0.0F, f10);
            worldrenderer.startDrawingQuads();
            worldrenderer.addVertexWithUV(-8.0D, -2.0D, 0.0D, (double)f2, (double)f4);
            worldrenderer.addVertexWithUV(8.0D, -2.0D, 0.0D, (double)f3, (double)f4);
            worldrenderer.addVertexWithUV(8.0D, 2.0D, 0.0D, (double)f3, (double)f5);
            worldrenderer.addVertexWithUV(-8.0D, 2.0D, 0.0D, (double)f2, (double)f5);
            tessellator.draw();
        }

This draws the same quad rotated four times around the x axis (i.e. rotating 90 degrees each time).

 

If you copy this code as a basis for yours, you'll probably be able to work it out for the last plane?

This link might also help if you haven't use tessellator before

http://greyminecraftcoder.blogspot.com.au/2014/12/the-tessellator-and-worldrenderer-18.html

 

and a bit more information about OpenGL here

http://www.glprogramming.com/red/

-chapter 3

 

-TGG

 

 

Link to comment
Share on other sites

Okay... I think I understand.. but I'm still not understanding how to rotate the texture on a different axis. In order to get it to work the way I wanted it, I'll have to rotate it not only on the axis the arrow does it on, but also on the uh... well the arrow rotates on the axis that the player is facing in... so I guess it depends on that. Anyway, I want to rotate it on the axis that is perpendicular to the aforementioned axis, and is parallel to the ground.

 

I hope that can be understood >_<.

Link to comment
Share on other sites

Math.  It's called "math."  When you math things you can locate vertices in space.

 

Protip: any two non-parallel vectors can be cross-product-ed together to produce a third vector perpendicular to the first two.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Okay... I think I understand.. but I'm still not understanding how to rotate the texture on a different axis. In order to get it to work the way I wanted it, I'll have to rotate it not only on the axis the arrow does it on, but also on the uh... well the arrow rotates on the axis that the player is facing in... so I guess it depends on that. Anyway, I want to rotate it on the axis that is perpendicular to the aforementioned axis, and is parallel to the ground.

 

I hope that can be understood >_<.

Hi

 

Yeah it's pretty confusing that's for sure.

 

If you want an arrow-like sphere, draw six quads, aligned with the three axes.

The EntityArrow has shown you how to do the first four, rotating around the x-axis, which corresponds to the shaft of the arrow (not the direction the player is facing)

Then, do the last two by rotating around the y axis.

GlStateManager.rotate(90.0F, 0.0F, 1.0F, 0.0F);

and then

GlStateManager.rotate(180.0F, 0.0F, 1.0F, 0.0F);

 

Alternatively, you could just draw the six quads explicitly and don't worry about the GLstateManager.rotate.

i.e. with vertices

[-8,-8,0] to [8,8,0]

and

[0,-8,-8]to[0,8,8]

and

[-8,0,-8]to[8,0,8]

 

Like drawing a cube except all the faces have been moved back to the middle of the cube so that they stick through each other - similar to Draco's picture.

 

I don't think you need to rotate the sphere depending on the way the player is looking.  Why do you think that's necessary?

 

If you want to try it - you could use Draco's suggestion i.e. calculate the cross product of the arrow's axis with the vertical vector (i.e. [0, 1, 0] ).  That will give you a vector perpendicular to the arrow and parallel to the ground.

 

-TGG

 

 

 

 

Link to comment
Share on other sites

The cross product thing I did once so I could turn every edge of a 3D model into a thick line (a quad) and wanted those quads to always face the camera.  Was a bitch to figure out until I remembered the cross product trick (had to do it 3 times to get the necessary vectors).

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.