Jump to content

World To Screen


JakeAU

Recommended Posts

	GLdouble model_view[16];
	GLdouble projection[16];
	GLint viewport[16];
	auto modview = java_environment->GetStaticObjectField(c_offsets::get().active_render_class,
		c_offsets::get().model_view_field);
	auto proj = java_environment->GetStaticObjectField(c_offsets::get().active_render_class,
		c_offsets::get().projection_field);
	auto views = java_environment->GetStaticObjectField(c_offsets::get().active_render_class,
		c_offsets::get().viewport_field);

	auto* ptr = java_environment->GetDirectBufferAddress(modview);
	float* mid = new float[16];
	mid = (float*)ptr;
	for (int i = 0; i < 16; i++)
	{
		model_view[i] = mid[i];
	}

	...
    GLdouble sx1, sy1, sz1;
   	if (gluProject(0, 70, 0, model_view, projection, viewport, &sx1, &sy1, &sz1)
	{
		temp_ent.back().b1 = vec2_t(sx1, sy1);
		temp_ent.back().b2 = vec2_t(sx1 + 10, sy1 + 10);
	}
                           

 

Besides the bad code practices, this is just the most recent attempt for me to get it to work. 

 

I don't understand how to get the 2d coordinates from 3d coordinates.

 

Video of result

https://i.gyazo.com/8a95d2eea6c8a53b8c49f85eaf67f46e.mp4

 

It seems that coordinate is relative to the position of the local player. If I set the position to 100,0,100 it appears in the 1,0,1 direction and same with -100,0,-100.

 

Any advice would be appreciated thank you very much.  

Link to comment
Share on other sites

24 minutes ago, diesieben07 said:

I won't be able to help you with your problem, because I am not good at rendering stuff.

However, that looks like C or C++. What on earth are you doing?`

I'm making player info boxes for laby mod so you can leave notes about different players so you can pretend you remember people. I didn't have enough room on my laptop for eclipse so I used c++. I am coming to regret it. 

It is just super weird and I don't understand.

Link to comment
Share on other sites

I have access to pretty much everything in c++ that you can access in java it is also a lot faster for when I add tensorflow for some AI stuff. 

 

You can access the java vm through the natural interface. 

 

Also c++ is ❤️ and java ;( imo 

Link to comment
Share on other sites

Directly accessing the JVM is not a good idea. This will break the game when there are other mods using ASM. Moreover, looking up fields and methods during runtime via reflection (yes, even through JVM) is much, much slower than writing your code in Java, as the latter is compiled to bytecode and have direct access.

Therefore, you should not be writing mods in languages other than Java, as it is unnecessarily expensive.

 

As for your question, the easiest way would be via GLM. Simply apply the camera's transform onto the 3D point you want to transform. You can look up the specific calling on GLM's documentation.

 

12 hours ago, JakeAU said:

It seems that coordinate is relative to the position of the local player. If I set the position to 100,0,100 it appears in the 1,0,1 direction and same with -100,0,-100.

The transformation is relative to the transform of the camera. If I understood your intention correctly, you need to offset the position of your 3D points by the position of the player.

 

Also:

1. Please don't use raw pointers.

2. There is no need to cast the ptrs to a float array and copy it into a double array. gluProject takes in a void pointer; you can simply throw ptr into it without any explicit conversions.

3. Using GLdouble to store rendering data like model and projection is slow and unnecessary. Float should suffice, as the precision difference is not enough to be displayed on a pixelated viewport.

Edited by DavidM
  • Like 1

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Link to comment
Share on other sites

 
 
2
 Advanced issues found
 
 
1 hour ago, DavidM said:

As for your question, the easiest way would be via GLM. Simply apply the camera's transform onto the 3D point you want to transform. You can look up the specific calling on GLM's documentation.

 

The transformation is relative to the transform of the camera. If I understood your intention correctly, you need to offset the position of your 3D points by the position of the player.

 

Firstly thanks for your advice but I think your suggestion has gone completely over my head

 

		glm::mat < 4, 4, float> matrix;

		for (int i = 0; i < 4; i++)
		{
			for (int a = 0; a < 4; a++)
			{
				matrix[i][a] = model_view[i * 4 + a];
			}
		}

		glm::vec<3, float> position(0, 70, 0);


		matrix = glm::rotate(matrix, local_cammera_view.x, position);
		matrix = glm::rotate(matrix, local_cammera_view.y, position);
		matrix = glm::rotate(matrix, local_cammera_view.z, position);


		matrix = glm::translate(matrix, camera_position);

		for (int i = 0; i < 4; i++)
		{
			for (int a = 0; a < 4; a++)
			{
				model_view[i * 4 + a] = matrix[i][a];
			}
		}

 

Is this what you were suggesting because honestly, I don't understand why this would work our how to make it work. 

 

Thanks for the advice aswell, you are right of course. 

Link to comment
Share on other sites

I was a bit ambiguous. By "applying" the camera's transform, I meant to transform the 3D point according to the camera's transform in a certain way that maps the point to the viewport. I illustrated the algorithm in this post: https://www.minecraftforge.net/forum/topic/75508-how-do-i-convert-a-3d-point-to-screen-coordinates/?tab=comments#comment-361755.

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Link to comment
Share on other sites

Hey thanks for that link

1 hour ago, DavidM said:

I was a bit ambiguous. By "applying" the camera's transform, I meant to transform the 3D point according to the camera's transform in a certain way that maps the point to the viewport. I illustrated the algorithm in this post: https://www.minecraftforge.net/forum/topic/75508-how-do-i-convert-a-3d-point-to-screen-coordinates/?tab=comments#comment-361755.

		vec3_t position = vec3_t(0, 70, 0) - camera_position;

		position.x *= sin(local_cammera_view.y);
		position.y *= sin(local_cammera_view.x);
		position.z *= cos(local_cammera_view.y) * cos(local_cammera_view.x);

		GLdouble sx = position.x / position.z * game_fov;
		GLdouble sy = position.y / position.z * game_fov;

That resulted in this event: https://i.gyazo.com/054252485aba112c846cace23c364410.mp4

In the the above code it wouldn't matter if x or z is used

If I was meant to transform position before using gluproject  if (gluProject(position.x, position.y, position.z, model_view, projection, viewport, &sx, &sy, &sz))

This is the result after setting sx and sy to be zero. 

 

https://i.gyazo.com/11e06756af447235f6844a108c612d5f.mp4

 

That was achieved using the local players location / rotation rather the game camera. (I used the camera position and still same result, I suppose it is to do with being able to work out what the below means.)


Any help would be greatly appreciated

 

As I simply don't understand this. 

rotationXZ     The combined X and Z components of the entity's pitch rotation
rotationX     The X component of the entity's yaw rotation
rotationXY     The Y component (scaled along the X axis) of the entity's pitch rotation
rotationYZ     The Y component (scaled along the Z axis) of the entity's pitch rotation
rotationZ     The Z component of the entity's yaw rotation
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.

Announcements



×
×
  • Create New...

Important Information

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