private float animateArrestingWire(SceneNode arrestingWire, float targetWorldXPos) { float lastH; SceneNode lWire = (SceneNode)arrestingWire.GetChild(0); SceneNode rWire = (SceneNode)arrestingWire.GetChild(1); SceneNode temp; // fix zamienione nody if (rWire.Name.StartsWith(name + "_LArrestingWire")) { temp = lWire; lWire = rWire; rWire = temp; } lastH = lWire._getDerivedPosition().x - targetWorldXPos; Radian alpha = Math.ATan(lastH / (0.5f * arrestingWiresSpan)); // k¹t wychylenia kawalkow liny float length = lastH / Math.Sin(alpha); // dlugosc liny lWire.Orientation = new Quaternion(Math.HALF_PI, Vector3.UNIT_X); lWire.Orientation *= new Quaternion(Math.HALF_PI, Vector3.UNIT_Z); lWire.Orientation *= new Quaternion(alpha, Vector3.NEGATIVE_UNIT_Z); lWire.SetScale(1, length, 1); rWire.Orientation = new Quaternion(Math.HALF_PI, Vector3.UNIT_X); rWire.Orientation *= new Quaternion(Math.HALF_PI, Vector3.NEGATIVE_UNIT_Z); rWire.Orientation *= new Quaternion(alpha, Vector3.UNIT_Z); rWire.SetScale(1, length, 1); return(lastH); }
//-------------------------------------------------------------- public void modify() { if (mInputTriangleBuffer == null) { OGRE_EXCEPT("Exception::ERR_INVALID_STATE", "Input triangle buffer must be set", "__FUNCTION__"); } ; //for (List<TriangleBuffer.Vertex>.Enumerator it = mInputTriangleBuffer.getVertices().begin(); it != mInputTriangleBuffer.getVertices().end(); ++it) foreach (var it in mInputTriangleBuffer.getVertices()) { Vector3 v = it.mPosition.NormalisedCopy; Vector2 vxz = new Vector2(v.x, v.z); it.mUV.x = Utils.angleTo(Vector2.UNIT_X, vxz).ValueRadians / Math.TWO_PI; it.mUV.y = (Math.ATan(v.y / vxz.Length).ValueRadians + Math.HALF_PI) / Math.PI; } }
//-------------------------------------------------------------- public void modify() { if (mInputTriangleBuffer == null) { OGRE_EXCEPT("Exception::ERR_INVALID_STATE", "Input triangle buffer must be set", "__FUNCTION__"); } if (mHeight <= 0f) { OGRE_EXCEPT("Exception::ERR_INVALID_STATE", "Height must be strictly positive", "__FUNCTION__"); } if (mRadius <= 0f) { OGRE_EXCEPT("Exception::ERR_INVALID_STATE", "Radius must be strictly positive", "__FUNCTION__"); } ; float angleThreshold = Math.ATan(mHeight / mRadius).ValueRadians; //for (List<TriangleBuffer.Vertex>.Enumerator it = mInputTriangleBuffer.getVertices().begin(); it != mInputTriangleBuffer.getVertices().end(); ++it) foreach (var it in mInputTriangleBuffer.getVertices()) { Vector2 nxz = new Vector2(it.mNormal.x, it.mNormal.z); float alpha = (Math.ATan(it.mNormal.y / nxz.Length).ValueRadians + Math.HALF_PI); if (Math.Abs(alpha) > angleThreshold) { Vector2 vxz = new Vector2(it.mPosition.x, it.mPosition.z); it.mUV = vxz / mRadius; } else { Vector2 vxz = new Vector2(it.mPosition.x, it.mPosition.z); it.mUV.x = Utils.angleTo(Vector2.UNIT_X, vxz).ValueRadians / Math.TWO_PI; it.mUV.y = it.mPosition.y / mHeight - 0.5f; } } }