Skip to content

Commit

Permalink
Expose player_eye_position and player_view_direction (#102)
Browse files Browse the repository at this point in the history
* Add playerEyePosition and playerViewDirection

* Expose player_eye_position and player_view_direction from MinetestEnv

---------

Co-authored-by: HeavenlyBerserker <[email protected]>
  • Loading branch information
mickvangelderen and HeavenlyBerserker authored Feb 18, 2025
1 parent 0bee7f7 commit 13a4e4b
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 0 deletions.
12 changes: 12 additions & 0 deletions minetest-gymnasium/minetest/minetest_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,8 @@ class Info(TypedDict):
player_inventory: list[InventorySlot]
player_hotbar_size: int
player_hotbar_selected_index: int
player_eye_position: tuple[float, float, float]
player_view_direction: tuple[float, float, float]


RewardFn = Callable[[Observation, Info], float]
Expand Down Expand Up @@ -830,6 +832,10 @@ def _step_response_player_metadata(step_response) -> dict[str, str]:
}


def _step_response_vector3(value) -> tuple[float, float, float]:
return (value.x, value.y, value.z)


def _step_response_info(step_response) -> Info:
return Info(
hud_elements=_step_response_hud_elements(step_response),
Expand All @@ -845,6 +851,12 @@ def _step_response_info(step_response) -> Info:
],
player_hotbar_size=step_response.observation.playerHotbarSize,
player_hotbar_selected_index=step_response.observation.playerHotbarSelectedIndex,
player_eye_position=_step_response_vector3(
step_response.observation.playerEyePosition
),
player_view_direction=_step_response_vector3(
step_response.observation.playerViewDirection
),
)


Expand Down
8 changes: 8 additions & 0 deletions minetest-gymnasium/minetest/proto/remoteclient.capnp
Original file line number Diff line number Diff line change
Expand Up @@ -133,12 +133,20 @@ struct Observation {
playerBreath @4 :UInt16;
playerBreathMax @5 :UInt16;
playerIsDead @6 :Bool;
playerEyePosition @11 :Vector3;
playerViewDirection @12 :Vector3;
playerMetadata @7 :MapTextText;
playerInventory @8 :List(ItemStack);
playerHotbarSize @9 :UInt16;
playerHotbarSelectedIndex @10 : UInt16;
}

struct Vector3 {
x @0 :Float32;
y @1 :Float32;
z @2 :Float32;
}

interface Minetest {
init @0 () -> ();
step @1 (action :Action) -> (observation :Observation);
Expand Down
20 changes: 20 additions & 0 deletions src/client/remoteinputhandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,24 @@ void RemoteInputHandler::step(float dtime) {
m_should_send_observation = true;
}

static auto set_vector3(::proto::Vector3::Builder builder, v3f value) {
builder.setX(value.X);
builder.setY(value.Y);
builder.setZ(value.Z);
return builder;
}

static auto get_player_view_direction(PlayerSAO const & remote_player_sao) {
// Rotation computations are a mess in minetest. Logic taken from
// src/serverenvironment.cpp:387
v3f camera_dir = v3f(0,0,1);
camera_dir.rotateYZBy(static_cast<f64>(remote_player_sao.getLookPitch()));
camera_dir.rotateXZBy(static_cast<f64>(remote_player_sao.getRotation().Y));
if (remote_player_sao.getCameraInverted())
camera_dir = -camera_dir;
return camera_dir;
}

void RemoteInputHandler::step_post_render() {
if (!m_should_send_observation) {
return;
Expand Down Expand Up @@ -236,6 +254,8 @@ void RemoteInputHandler::step_post_render() {
obs_builder.setPlayerBreath(remote_player_sao->getBreath());
obs_builder.setPlayerBreathMax(remote_player_props->breath_max);
obs_builder.setPlayerIsDead(remote_player_sao->isDead());
set_vector3(obs_builder.initPlayerEyePosition(), remote_player_sao->getEyePosition());
set_vector3(obs_builder.initPlayerViewDirection(), get_player_view_direction(*remote_player_sao));

const auto& player_meta = remote_player_sao->getMeta().getStrings();
auto builder = obs_builder.initPlayerMetadata();
Expand Down

0 comments on commit 13a4e4b

Please sign in to comment.