Jump to content

How Would I Get A Thrown Entity to Circle Around Another One?


gurujive

Recommended Posts

I have a thrown entity I can summon in for lengths of time, It acts as though it has no gravity.

 

What I would like to do is from that entity have another entity that circulates around it on the horizontal plane.

 

Is there some simple looking code or an example of this anywhere anyone knows of?

 

The purpose of this is to imitate flowing of ocean waves with multiple circulating objects.

Link to comment
Share on other sites

The initial description sounds more like a sun and planets, but whatever...

 

For one object to orbit another, you need to give the orbiter an initial velocity tangential to the hub, then periodically impart a radial impulse toward the hub. Calculating the vector directions will be easy, but calibrating magnitude will take testing.

 

Your orbiter can tick 20 times per second, and you can initialize radius and tangential speed, which tells you how many ticks you have to complete an orbit. Start doing physics calculations for circular motion.

 

And then decide what should happen if anything gets in the way.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Link to comment
Share on other sites

Here is an example of what I'm talking about (its definitely not planets):

 

(I can just imagine some awesome floors and stuff, and it would be super easy to set up with some repeaters.)

 

I've been looking at some things, I don't know how I will loop it exactly right now.

But I could summon the entity in, then have it add motion to itself. Then do that at intervals of time.

My question was more related to if there was some kind of multiplication example or something to make the adding motion part easier. Or if I would have to have more intervals of motion being added. Instead of some algorithm drawing the line for me.

 

(I guess I'd just like to know if there is such an algorithm, but then again drawing a circular line around an object by summoning things from the center of it to complete a circle then have something spawn to travel that circle may just be a tad too bit complex/unnecessary)

 

But I find myself in the same predicament with adding motion several times then looping it somehow.

 

It would be simpler to have some kind of algorithm that as it existed an amount of motion would be added in that would allow it to travel around in a circle. But I'm not really technically advanced here... I have something to learn here for certain.

 

And then decide what should happen if anything gets in the way.

ftw:

 

if (!this.worldObj.isRemote)
        {
            this.doBlockCollisions();
        }

Link to comment
Share on other sites

Hi

 

Like the previous answers said, programming a circular motion is easy if you use a bit of trigonometry; look up the "unit circle" for more information.  Your object needs to store the angle, the radius, then convert these to x and z using trig.  Every tick, you just increase the angle.

 

There is a way to make an object circle around a point without using trig, it's based on the fact that the derivative of sine and cosine are also cosine and sine; so if the object is circling around a point at a constant height (constant y) then you can calculate

 

x_velocity_object = A.(z_position_object - z_position_point)

z_velocity_object = A.(x_position_object - x_position_point).

 

Just choose a suitable value for the constant A (the speed), initialise the x_position_object and the z_position_object at the desired starting location (radius from the centre point), and then every tick update the velocity using those calculations.

 

It will perform a circular paths for quite a few rotations, although it may drift eventually due to roundoff errors.

 

-TGG

 

 

 

 

Link to comment
Share on other sites

The picture you showed was a large number of particles moving in circles, and none of them were circling around any of the others. Instead, each circled about a fixed point, and the apparent wave motion there depends on coordinating the phases of the various particles.

 

To simulate this in detail, you would need a field of tile entities (computationally expensive), with each responding both to its neighbors (propagation) and specific external stimuli (stimulation).

 

What is it that you are ultimately trying to achieve?

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Link to comment
Share on other sites

By the way, if you're uncomfortable with trigonometry (it is even more of a pain in computing if you aren't comfortable with with concept of radians) you can actually do repetitive motion without any actual math.

 

Instead of math you can take some graph paper and find the points on the path you want and then put those into a List data structure and then cycle through that. I use this a lot in animating entities where calculating the trigonometry is complex or where the motion does not follow a simple equation. This is the same technique that "stop motion" animation uses -- you just put the object in each position and then run them together to make the illusion of motion.

 

Since Minecraft uses 20 ticks per second, if you wanted the circular motion to take 1 second then you need 20 points from a circle in your list.

 

And since you want the motion to be around another entity, you would just add the values from the List to the position you want to orbit around.

 

In most cases of animation, using this method (a List of positions) will give better results and take very little time than trying to calculate the positions.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

The picture you showed was a large number of particles moving in circles, and none of them were circling around any of the others. Instead, each circled about a fixed point, and the apparent wave motion there depends on coordinating the phases of the various particles.

 

To simulate this in detail, you would need a field of tile entities (computationally expensive), with each responding both to its neighbors (propagation) and specific external stimuli (stimulation).

 

What is it that you are ultimately trying to achieve?

 

I'm a big fan of making particles do weird things. If I had a field of these things to execute particles at I'd have a bunch of fun with it. Ocean waves of particles.

 

I'd just like to do as many cool things with particles and moving pieces as I possibly can.

Link to comment
Share on other sites

a thing I did once to make an entity circle another entity, was spawn the first, immobile entity, that would rotate its view around every tick.

 

rotationYawHead += 2f;

 

then you can get the vector frow its view

 

Vec3d vec = getVectorForRotation(0, rotationYawHead);

 

and from that vector, you can get the x and z coordinates, + the position of the immobile entity to set the position of the rotating entity.

 

myentity.setPosition(imobileEntity.x+vec.xcoord, [...] );

feel free to devide the vec.xcoord by 5 or any other number to adjust distance to the entity

Link to comment
Share on other sites

Which of course, is the same thing as working out the trig yourself, except it requires an additional entity.

 

Like seriously.  Sine and Cosine are amazing.

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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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