From 058460dd1209c48d43f7018dc0bfbd09261ed083 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 15 Oct 2022 16:52:38 +0300 Subject: [PATCH] land units change elevation and orientation to match the surface --- aircraftCarrier.cpp | 2 +- demoJet.cpp | 2 +- jet.cpp | 2 +- unit.cpp | 67 +++++++++++++++++++++++++-------------------- unit.h | 2 +- 5 files changed, 42 insertions(+), 33 deletions(-) diff --git a/aircraftCarrier.cpp b/aircraftCarrier.cpp index cae0712..15e4af1 100755 --- a/aircraftCarrier.cpp +++ b/aircraftCarrier.cpp @@ -58,7 +58,7 @@ namespace battleship{ if (j && j->isOnBoard()) { Vector3 oP = j->getOffsetPos(); - j->orientUnit(dirVec); + //j->orientUnit(dirVec); j->placeUnit(pos + leftVec * oP.x + upVec * oP.y - dirVec * oP.z); } } diff --git a/demoJet.cpp b/demoJet.cpp index 9a1e261..2eb3cfb 100755 --- a/demoJet.cpp +++ b/demoJet.cpp @@ -20,7 +20,7 @@ namespace battleship{ if(maxTurnAngle < angle / PI * 180){ Quaternion rotQuat = Quaternion(maxTurnAngle / 180 * PI, axis); - orientUnit(rotQuat*dirVec); + //orientUnit(rotQuat*dirVec); } } else diff --git a/jet.cpp b/jet.cpp index f469529..78d4a09 100755 --- a/jet.cpp +++ b/jet.cpp @@ -55,7 +55,7 @@ namespace battleship{ else if(PI - angle < anglePrecision[id] / 180 * PI){ onBoard = true; landing = true; - orientUnit(-aircraftCarrier->getDirVec()); + //orientUnit(-aircraftCarrier->getDirVec()); } } } diff --git a/unit.cpp b/unit.cpp index 0d4be4d..12af652 100755 --- a/unit.cpp +++ b/unit.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include @@ -81,25 +82,24 @@ namespace battleship{ } void Unit::update() { - leftVec = model->getGlobalAxis(0); - upVec = model->getGlobalAxis(1); - dirVec = model->getGlobalAxis(2); + leftVec = model->getGlobalAxis(0); + upVec = model->getGlobalAxis(1); + dirVec = model->getGlobalAxis(2); if (!orders.empty()){ - LineRenderer *lineRenderer = LineRenderer::getSingleton(); - lineRenderer->toggleVisibility(orders[0].line.id, selected && canDisplayOrderLine()); - lineRenderer->changeLineField(orders[0].line.id, pos, LineRenderer::START); + LineRenderer *lineRenderer = LineRenderer::getSingleton(); + lineRenderer->toggleVisibility(orders[0].line.id, selected && canDisplayOrderLine()); + lineRenderer->changeLineField(orders[0].line.id, pos, LineRenderer::START); } executeOrders(); - screenPos = spaceToScreen(pos); - hpBackgroundNode->setVisible(selected); - hpForegroundNode->setVisible(selected); + screenPos = spaceToScreen(pos); + hpBackgroundNode->setVisible(selected); + hpForegroundNode->setVisible(selected); - if (selected) { + if (selected) displayUnitStats(); - } if (health <= 0) blowUp(); @@ -154,13 +154,13 @@ namespace battleship{ Vector3 linDest = Vector3(pathPoints[0].x, pos.y, pathPoints[0].z); Vector3 destDir = (linDest - pos).norm(); - float angle = (destDir != Vector3::VEC_ZERO ? dirVec.getAngleBetween(destDir) : -1); + float angle = (destDir != Vector3::VEC_ZERO ? Vector3(dirVec.x, 0, dirVec.z).norm().getAngleBetween(destDir) : -1); UnitDataManager *udm = UnitDataManager::getSingleton(); if(angle > udm->getAnglePrecision()[id]){ float rotSpeed = (maxTurnAngle > angle ? angle : maxTurnAngle); - if(leftVec.getAngleBetween(destDir) > PI / 2) + if(Vector3(leftVec.x, 0, leftVec.z).norm().getAngleBetween(destDir) > PI / 2) rotSpeed *= -1; turn(rotSpeed); @@ -182,12 +182,30 @@ namespace battleship{ advance(movementAmmount, MoveDir::UP); } - if(pos.getDistanceFrom(pathPoints[0]) <= destOffset) + if(pos.getDistanceFrom(type != UnitType::UNDERWATER ? linDest : pathPoints[0]) <= destOffset) pathPoints.erase(pathPoints.begin()); } if(pathPoints.empty()) removeOrder(0); + + vector res; + + if(type == UnitType::LAND){ + Map *map = Map::getSingleton(); + TerrainObject terr = map->getTerrainObject(0); + Ray::retrieveCollisions(Vector3(pos.x, terr.size.y, pos.z), Vector3(0, -1, 0), terr.node, res); + Ray::sortResults(res); + + if(!res.empty()){ + placeUnit(res[0].pos); + + float angle = upVec.getAngleBetween(res[0].norm); + Vector3 axis = upVec.cross(res[0].norm).norm(); + Quaternion rotQuat = Quaternion(angle, axis); + orientUnit(rotQuat * rot); + } + } } void Unit::patrol(Order order) { @@ -216,8 +234,9 @@ namespace battleship{ } void Unit::turn(float angle) { - Quaternion rotQuat = Quaternion(angle, Vector3(0, 1, 0)); - model->setOrientation(rotQuat * model->getOrientation()); + Quaternion newRot = Quaternion(angle, Vector3(0, 1, 0)) * model->getOrientation(); + model->setOrientation(newRot); + rot = newRot; } void Unit::halt() { @@ -241,19 +260,9 @@ namespace battleship{ pos = p; } - void Unit::orientUnit(Vector3 orientVec){ - Vector3 orientVecProj = Vector3(orientVec.x, 0, orientVec.z).norm(); - float projAngle = orientVec.getAngleBetween(orientVecProj); - float rotAngle = Vector3(0,0,-1).getAngleBetween(orientVecProj); - - rotAngle *= (orientVec.x < 0 ? 1 : -1) / PI * 180; - projAngle *= (orientVec.y > 0 ? 1 : -1) / PI * 180; - dirVec = orientVecProj; - upVec = Vector3(0,1,0); - leftVec = Quaternion(-PI / 2, upVec) * dirVec; - Quaternion rotQuat = Quaternion(projAngle / 180 * PI, leftVec); - dirVec = rotQuat * dirVec; - upVec = rotQuat * upVec; + void Unit::orientUnit(Quaternion rotQuat){ + model->setOrientation(rotQuat); + rot = rotQuat; } Vector3 Unit::getCorner(int i) { diff --git a/unit.h b/unit.h index 2500302..939b245 100755 --- a/unit.h +++ b/unit.h @@ -57,7 +57,7 @@ namespace battleship{ void toggleSelection(bool); void setOrder(Order); void placeUnit(vb01::Vector3); - void orientUnit(vb01::Vector3); + void orientUnit(vb01::Quaternion); void addProjectile(Projectile*); float getCircleRadius(); vb01::Vector3 getCorner(int);