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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Join one of the largest civilization experiments in Minecraft under our banner!   Our goal is to create the largest and most prominent civilization across the entirety of Minecraft, and we’d like you to join! We offer lots of unique roles and jobs that tailor to your specific skillset in Minecraft! You can build a city, participate in the government, or fight for Gold, God, and Glory on the battlefield!   Join our nation today! https://discord.gg/hb3cuaDezA
    • I have an issue where after I exit the world the capability data does not save when I reload the world. It will save the initial data such as village name but if I modify any data during gameplay theres a 5% chance the data saves when I exit then reload the world. I read the docs and was told that chunks need to be marked dirty but the docs does not say how to mark the chunk dirty... Heres the provider: public class ChunkCapProvider implements ICapabilityProvider, ICapabilitySerializable<CompoundTag> { private final Capability<IChunk> capability = ChunkCapability.CHUNK_CAPABILITY; private final ChunkCapability instance = new ChunkCapability(); private final LazyOptional lazy = LazyOptional.of(()->instance).cast(); public void invalidate(){ lazy.invalidate(); } @Nonnull @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction direction) { if(cap == capability ) return lazy; return LazyOptional.empty(); } @Override public CompoundTag serializeNBT() { return instance.serializeNBT(); } @Override public void deserializeNBT(CompoundTag tag) { instance.deserializeNBT(tag); } }   Heres the capability class: public class ChunkCapability implements IChunk { public static final ResourceLocation ID = new ResourceLocation(Main.MODID, "owner"); public static final String VILLAGE_NAME = "village_name"; public static final String SAVED_ROLES = "saved_roles"; public static final String SAVED_POINTS = "saved_points"; public static final String BAD_CHUNK = "BAD_VILLAGE_CHUNK"; public static Capability<IChunk> CHUNK_CAPABILITY = null; private String villageName = "BAD_VILLAGE_CHUNK"; private String savedRoles = ""; private String savedPoints = ""; public ChunkCapability(){ this.getClass(); } @Override public CompoundTag serializeNBT() { CompoundTag nbt = new CompoundTag(); nbt.putString(SAVED_ROLES, this.savedRoles); nbt.putString(SAVED_POINTS, this.savedPoints); nbt.putString(VILLAGE_NAME, this.villageName); return nbt; } public void deserializeNBT(CompoundTag tag) { this.setVillageName(tag.getString(VILLAGE_NAME)); this.setSavedRoles(tag.getString(SAVED_ROLES)); this.setSavedPoints(tag.getString(SAVED_POINTS)); } public String getVillageName() { return this.villageName; } public void setVillageName(String str) { this.villageName = str; } public void setSavedRoles(String str) { this.savedRoles = str; } public void setRole(String name, String role){ if(!this.hasRole(name)) { this.savedRoles += (name + ":" + role + ","); this.savedPoints += (name + ":" + 10 + ","); return; } String roleName = this.getRole(name); String firstStr = this.savedRoles.substring(0, this.savedRoles.indexOf(name + ":") + name.length() + 1); String lastStr = this.savedRoles.substring(this.savedRoles.indexOf(name + ":") + ((name.length() + 1) + roleName.length())); this.savedRoles = firstStr + role + lastStr; } public String getRole(String name){ if(this.savedRoles.isEmpty() || !this.savedRoles.contains(name)) { this.setRole(name, Roles.Role.FOREIGNER.getName()); } String fStr = this.savedRoles.substring(this.savedRoles.indexOf(name + ":"), this.savedRoles.indexOf(',')); return fStr.substring(fStr.indexOf(':') + 1); } public boolean hasRole(String name) { if(this.savedRoles.isEmpty()) return false; return this.savedRoles.contains(name); } public String getSavedRoles() { return this.savedRoles; } public String getSavedPoints() { return this.savedPoints; } public void setSavedPoints(String name) { this.savedPoints = name; } public int getPoints(String name) { if(this.savedPoints.isEmpty() || !this.savedRoles.contains(name)) this.setPoints(name, 10); String fStr = this.savedPoints.substring(this.savedPoints.indexOf(name + ':')); return Integer.parseInt(fStr.substring(fStr.indexOf(':') + 1, fStr.indexOf(','))); } public void setPoints(String name, int rV) { if(!this.hasPoints(name)){ this.savedPoints += (name + ":" + rV + ","); return; } String oldPoints = String.valueOf(this.getPoints(name)); String points = String.valueOf(rV); String firstStr = this.savedPoints.substring(0, this.savedPoints.indexOf(name + ":") + name.length() + 1); String lastStr = this.savedPoints.substring(this.savedPoints.indexOf(name + ":") + ((name.length() + 1) + oldPoints.length())); Minecraft.getInstance().player.displayClientMessage(Component.nullToEmpty("Saved String: " + (firstStr + points + lastStr)), false); this.savedPoints = (firstStr + points + lastStr); } public boolean hasPoints(String name) { if(this.savedPoints.isEmpty()) return false; return this.savedPoints.contains(name); } }   Heres where I attach/register: @Mod.EventBusSubscriber(modid = Main.MODID) public class CapabilityEvents { @SubscribeEvent public static void attachCapability(AttachCapabilitiesEvent<LevelChunk> event){ ChunkCapProvider provider = new ChunkCapProvider(); event.addCapability(ChunkCapability.ID, provider); event.addListener(provider::invalidate); } }  
    • Id use this ServerLevel#findNearestMapFeature  
    • Trying to play with the mods: Tinkers Construct, Buildcraft and the Blood Magic addon Blood Arsenal; the game crashes. I noticed that when trying to use only two of the three in any combination the game opens without problems, but when trying to put all three together the error occurs. Is there any configuration I can modify or any other way to solve the problem?   ---- Minecraft Crash Report ---- // Hi. I'm Minecraft, and I'm a crashaholic. Time: 5/22/24 8:48 PM Description: There was a severe problem during mod loading that has caused the game to fail cpw.mods.fml.common.LoaderException: java.lang.NoClassDefFoundError: tconstruct/library/weaponry/AmmoWeapon     at cpw.mods.fml.common.LoadController.transition(LoadController.java:163)     at cpw.mods.fml.common.Loader.loadMods(Loader.java:544)     at cpw.mods.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:208)     at net.minecraft.client.Minecraft.func_71384_a(Minecraft.java:480)     at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:878)     at net.minecraft.client.main.Main.main(SourceFile:148)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)     at java.lang.reflect.Method.invoke(Unknown Source)     at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)     at net.minecraft.launchwrapper.Launch.main(Launch.java:28) Caused by: java.lang.NoClassDefFoundError: tconstruct/library/weaponry/AmmoWeapon     at java.lang.Class.forName0(Native Method)     at java.lang.Class.forName(Unknown Source)     at cpw.mods.fml.common.ProxyInjector.inject(ProxyInjector.java:42)     at cpw.mods.fml.common.FMLModContainer.constructMod(FMLModContainer.java:512)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)     at java.lang.reflect.Method.invoke(Unknown Source)     at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)     at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)     at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)     at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)     at com.google.common.eventbus.EventBus.post(EventBus.java:275)     at cpw.mods.fml.common.LoadController.sendEventToModContainer(LoadController.java:212)     at cpw.mods.fml.common.LoadController.propogateStateMessage(LoadController.java:190)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)     at java.lang.reflect.Method.invoke(Unknown Source)     at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)     at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)     at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)     at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)     at com.google.common.eventbus.EventBus.post(EventBus.java:275)     at cpw.mods.fml.common.LoadController.distributeStateMessage(LoadController.java:119)     at cpw.mods.fml.common.Loader.loadMods(Loader.java:513)     ... 10 more Caused by: java.lang.ClassNotFoundException: tconstruct.library.weaponry.AmmoWeapon     at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191)     at java.lang.ClassLoader.loadClass(Unknown Source)     at java.lang.ClassLoader.loadClass(Unknown Source)     ... 36 more Caused by: java.lang.NoClassDefFoundError: tconstruct/library/weaponry/AmmoItem     at java.lang.ClassLoader.defineClass1(Native Method)     at java.lang.ClassLoader.defineClass(Unknown Source)     at java.security.SecureClassLoader.defineClass(Unknown Source)     at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:182)     ... 38 more Caused by: java.lang.ClassNotFoundException: tconstruct.library.weaponry.AmmoItem     at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:101)     at java.lang.ClassLoader.loadClass(Unknown Source)     at java.lang.ClassLoader.loadClass(Unknown Source)     ... 42 more A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details:     Minecraft Version: 1.7.10     Operating System: Windows 10 (x86) version 10.0     Java Version: 1.8.0_411, Oracle Corporation     Java VM Version: Java HotSpot(TM) Client VM (mixed mode, sharing), Oracle Corporation     Memory: 271923192 bytes (259 MB) / 402653184 bytes (384 MB) up to 536870912 bytes (512 MB)     JVM Flags: 9 total; -Xmx512M -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -XX:+IgnoreUnrecognizedVMOptions -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump     AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used     IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0     FML: MCP v9.05 FML v7.10.99.99 Minecraft Forge 10.13.4.1614 14 mods loaded, 14 mods active     States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored     UC    mcp{9.05} [Minecraft Coder Pack] (minecraft.jar)      UC    FML{7.10.99.99} [Forge Mod Loader] (forge-1.7.10-10.13.4.1614-1.7.10.jar)      UC    Forge{10.13.4.1614} [Minecraft Forge] (forge-1.7.10-10.13.4.1614-1.7.10.jar)      UC    AWWayofTime{v1.3.3} [Blood Magic: Alchemical Wizardry] (BloodMagic-1.7.10-1.3.3-17.jar)      UC    Mantle{1.7.10-0.3.2.jenkins191} [Mantle] (Mantle-1.7.10-0.3.2b.jar)      UE    TConstruct{1.7.10-1.8.8.build991} [Tinkers' Construct] (TConstruct-1.7.10-1.8.8.build991.jar)      UC    BloodArsenal{1.2-5} [Blood Arsenal] (BloodArsenal-1.7.10-1.2-5.jar)      UC    BuildCraft|Core{7.1.25} [BuildCraft] (buildcraft-7.1.25.jar)      UC    BuildCraft|Builders{7.1.25} [BC Builders] (buildcraft-7.1.25.jar)      UC    BuildCraft|Robotics{7.1.25} [BC Robotics] (buildcraft-7.1.25.jar)      UC    BuildCraft|Silicon{7.1.25} [BC Silicon] (buildcraft-7.1.25.jar)      UC    BuildCraft|Energy{7.1.25} [BC Energy] (buildcraft-7.1.25.jar)      UC    BuildCraft|Transport{7.1.25} [BC Transport] (buildcraft-7.1.25.jar)      UC    BuildCraft|Factory{7.1.25} [BC Factory] (buildcraft-7.1.25.jar)      GL info: ' Vendor: 'Intel' Version: '4.4.0 - Build 21.20.16.4541' Renderer: 'Intel(R) HD Graphics 610'     Mantle Environment: Environment healthy.     TConstruct Environment: Environment healthy.
    • fixed this problem but now i have a new one  java.lang.RuntimeException: java.lang.NoSuchFieldException: processor  Help 
  • Topics

×
×
  • Create New...

Important Information

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