Результаты поиска
| |
Cyber | Дата: Среда, 03 Июля 2013, 10:58 | Сообщение # 1 | Тема: Renderer NeoAxis |
был не раз
Сейчас нет на сайте
| Благодарю вас снова))
|
|
| |
Cyber | Дата: Вторник, 02 Июля 2013, 12:25 | Сообщение # 2 | Тема: Renderer NeoAxis |
был не раз
Сейчас нет на сайте
| Рендер в текстуру вышел, но немного не так как хотелось бы, я не понимаю как получать изображение с камеры на карте) Можете привести этот код в пример с комментариями? Я создал текстуру для рендера, добавил вьювпорт для камеры, а что дальше?)
|
|
| |
Cyber | Дата: Воскресенье, 30 Июня 2013, 19:53 | Сообщение # 3 | Тема: Renderer NeoAxis |
был не раз
Сейчас нет на сайте
| Нужно вывести изображение второй камеры в отдельное окошко GUI на экране. Можно ли это сделать без шаманства, если можно, то как?
|
|
| |
Cyber | Дата: Пятница, 14 Июня 2013, 15:13 | Сообщение # 4 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| Снова вы оказали неоценимую помощь)) Благодарю. А у меня с детства как идет невнимательность, так она и идет..)
|
|
| |
Cyber | Дата: Среда, 12 Июня 2013, 16:24 | Сообщение # 5 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| Это хорошо, так как знаете, снова нужна ваша помощь)) И что удивительно( для меня ) по тому же самому вопросу который мы уже как я думал прошли...) Дело опять всё в том, что не определяются ракетные блоки как оружие, а главное пулемет без проблем после прохода по прикрепленным объектам определяется. Я решил сделать как, при создании вертолета проходимся по прикрепленным объектам и ищем все оружия. У меня есть прикрепленный пулемет (AircraftGun), который попадает в коллекцию, и есть прикрепленный блок (типа Gun), который в коллекцию почему то не попадает.
Код protected override void OnPostCreate( bool loaded ) { base.OnPostCreate( loaded ); AddTimer();
foreach (MapObjectAttachedObject attachedObject in AttachedObjects) { MapObjectAttachedMapObject attachedMapObject = attachedObject as MapObjectAttachedMapObject; if (attachedMapObject == null) continue;
Gun mainG = (Gun)attachedMapObject.MapObject; if (mainG != null) { BlocksRocket.Add(mainG);/*Здесь пулемет попадает в коллекцию (тип AircraftGun), а ракетный блок (тип Gun) не попадет*/ break; } }
gunAttachObject = GetAttachedObjectByAlias("mainGun") as MapObjectAttachedMapObject; mainGun = (AircraftGun)gunAttachObject.MapObject; /*Пулемет*/
body = PhysicsModel.Bodies[0];
currentBlockRocket = BlocksRocket[0];
}
Сообщение отредактировал Cyber - Среда, 12 Июня 2013, 16:27 |
|
| |
Cyber | Дата: Вторник, 11 Июня 2013, 13:47 | Сообщение # 6 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| Теперь прямее некуда) На других форумах не лучше, а тут говорили эксперт есть в нео, сначала сомневался, а теперь вижу что есть такой)
|
|
| |
Cyber | Дата: Понедельник, 10 Июня 2013, 19:36 | Сообщение # 7 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| А я и не знал, что этот метод настолько полезен! Не расслабляйтесь, я еще здесь появлюсь) Благодарю, вы сильно помогли)) Добавлено (10.06.2013, 19:36) --------------------------------------------- Поведение пули не менял) Гравитацию не трогал) Но уже неважно, возьму на заметку эту полезнейшую функцию
|
|
| |
Cyber | Дата: Понедельник, 10 Июня 2013, 18:07 | Сообщение # 8 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| А вот в том то и дело что я для тестов сделал что пули вообще не зависят от вращения оружия. Я для чего метод GetBulletRotation то привел, вот в этом методе и вычисляется вращение пули, от этого вращения зависит куда она полетит. По моему в моей тригонометрии всё нормально, а пули так и летят выше чем нужно
|
|
| |
Cyber | Дата: Воскресенье, 09 Июня 2013, 17:53 | Сообщение # 9 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| Извиняюсь!) Благодарю за помощь) Пушка определяется, мой косяк, не знаю из за чего. Но я так и не понял почему пули летят не туда.
Код public Vec3 GetNeedPositionToTurnGun() { RayCastResult results = PhysicsWorld.Instance.RayCast( RendererWorld.Instance.DefaultCamera.GetCameraToViewportRay(EngineApp.Instance.MousePosition), (int)ContactGroup.CastOnlyContact);
if (results.Position == Vec3.Zero) { return Vec3.Zero; }
if (Math.Abs((Position - results.Position).Length()) < 10.0f) { return oldTurnGunPosition; }
oldTurnGunPosition = results.Position; return results.Position; } Здесь я определяю точку на которую указывает крусор
Код private Quat GetBulletRotation() { Vec3 posToTurn = GetNeedPositionToTurnGun();
Vec3 diff = posToTurn - Position;
Radian horizontalAngle = MathFunctions.ATan(diff.Y, diff.X); Radian verticalAngle = MathFunctions.ATan(diff.Z, diff.ToVec2().Length());
Quat conRot = new Angles(0, verticalAngle.InDegrees(), -horizontalAngle.InDegrees()).ToQuat(); return conRot; } А здесь я считаю куда должна повернуться пуля чтобы смотреть в сторону куда указывает курсор и лететь туда. Но она не летит туда куда указывает курсор) Можете помочь советом?
|
|
| |
Cyber | Дата: Воскресенье, 09 Июня 2013, 16:24 | Сообщение # 10 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| Конечно я ищу приаттаченную пушку в классе вертолета. Точнее я искал, пока не понял что это бесполезно. Я делал пушку на основе Gun, тот же самый результат что и с моей AircraftGun - не находит, ищу в классе самого вертолета к которому она относится
|
|
| |
Cyber | Дата: Воскресенье, 09 Июня 2013, 15:03 | Сообщение # 11 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| Я согласен что код работает, он обязан работать) И с вами я тоже согласен, проблема либо в типе пушки, либо в типе вертолета. Рад буду если укажете на ошибку)
http://rghost.ru/46624418
Здесь два типа, пушка и вертолет
|
|
| |
Cyber | Дата: Воскресенье, 09 Июня 2013, 13:39 | Сообщение # 12 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| А уже это я знаю) Но факт в том что не ищется пушка у вертолета никаким способом. Ни вашим, ни по аналогии с танком. Именно для этого я и сделал новый класс, чтобы даже искать ее не приходилось) Вот просто не находит, ни в OnPostCreate ни в OnTick Добавлено (09.06.2013, 13:39) --------------------------------------------- Думаете я бы стал сюда писать если бы проблема была настолько тривиальна?) Я знаю что у танка точно такой же способ крепления пушки, первое что я попробовал сделать это скопировать код у танка - не вышло, ссылка на несущесвующий объект. Так же я потом догадался что прикрепеленному объекту можно задать псевдоним, и и скать по нему - сслыка на несуществующий объект. Странно, всё что я могу тут сказать)
|
|
| |
Cyber | Дата: Воскресенье, 09 Июня 2013, 12:19 | Сообщение # 13 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| Благодарю за ответ) Попробую сделать как вы сказали, если что еще напишу тут)
Добавлено (09.06.2013, 12:16) --------------------------------------------- Только у вас там ошибочка, преобразование типа MapObjectAttachedObject в Gun невозможно
Сообщение отредактировал Cyber - Воскресенье, 09 Июня 2013, 12:21 |
|
| |
Cyber | Дата: Суббота, 08 Июня 2013, 10:06 | Сообщение # 14 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| Вот именно что по аналогии с танком не вышло. Почему то вертолет не хочет как танк находить у себя в прикрепленных объектах мой класс.
А так вот код, буду рад если поможете его домыслить) А то пули летят не туда куда нужно, по оси Z.
Код [color=blue] using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using Engine; using Engine.Renderer; using Engine.MathEx; using Engine.SoundSystem; using Engine.UISystem; using Engine.EntitySystem; using Engine.MapSystem; using Engine.PhysicsSystem; using Engine.FileSystem; using Engine.Utils; using GameCommon; using GameEntities;
namespace GameEntities { public class AircraftGunType : GunType { }
public class AircraftGun : Gun {
AircraftGunType _type = null; public new AircraftGunType Type { get { return _type; } }
/*Ствол*/ MapObjectAttachedObject mainGun;
float lastFireTime = 0;
protected override void OnPostCreate(bool loaded) { base.OnPostCreate(loaded);
mainGun = GetAttachedObjectByAlias("gun"); /*Ствол пушки*/ } /*Вычисление поворота для пули. Чтобы летела туда куда надо*/ private Quat GetBulletRotation() { Vec3 posToTurn = GetNeedPositionToTurnGun();
Vec3 diff = posToTurn - Position;
Radian horizontalAngle = MathFunctions.ATan(diff.Y, diff.X); Radian verticalAngle = MathFunctions.ATan(diff.Z, diff.ToVec2().Length());
Quat horRot = new Angles(0, verticalAngle.InDegrees(), -horizontalAngle.InDegrees()).ToQuat(); return horRot;
/*Quat rot = baseBody.Rotation.GetInverse() * turretBody.Rotation;
Quat verticalRot = new Angles(0, verticalAngle.InDegrees(), 0).ToQuat();
mainGunAttachedObject.PositionOffset = rot * mainGunOffsetPosition; mainGunAttachedObject.RotationOffset = rot * verticalRot;*/
}
/*Лучше не смотреть на этот код. (Исправить по возможности)*/ /*Поворот ствола к курсору*/ public void TurnMainGun() { Vec3 diff = GetNeedPositionToTurnGun() - Position;
Radian horizontalAngle = MathFunctions.ATan(diff.Y, diff.X); Radian verticalAngle = MathFunctions.ATan( diff.Z, diff.ToVec2().Length() );
/*По горизонтали поворот ствола относительно вертолета. Т.к. attachedObject*/ Angles resultHorizontal = (new Angles(0, 0, -horizontalAngle.InDegrees()) - Rotation.ToAngles());
mainGun.RotationOffset = (new Angles(0, verticalAngle.InDegrees(), 0) + resultHorizontal).ToQuat(); }
protected Quat TurnEffect() { Vec3 diff = GetNeedPositionToTurnGun() - Position;
Radian horizontalAngle = MathFunctions.ATan(diff.Y, diff.X); Radian verticalAngle = MathFunctions.ATan(diff.Z, diff.ToVec2().Length());
Angles resultHorizontal = (new Angles(0, 0, -horizontalAngle.InDegrees()) - Rotation.ToAngles());
return (new Angles(0, verticalAngle.InDegrees(), 0) + resultHorizontal).ToQuat(); }
protected override void CreateBullet(Mode mode) { Bullet obj = (Bullet)Entities.Instance.Create(mode.typeMode.BulletType, Parent); obj.SourceUnit = GetParentUnitHavingIntellect(); obj.Position = GetFirePosition(mode.typeMode);
{ Vec3 startPos = Position; if (AttachedMapObjectParent != null) startPos = AttachedMapObjectParent.Position;
Ray ray = new Ray(startPos, obj.Position - startPos); if (ray.Direction != Vec3.Zero) { RayCastResult[] piercingResult = PhysicsWorld.Instance.RayCastPiercing( ray, (int)ContactGroup.CastOnlyContact);
foreach (RayCastResult result in piercingResult) { MapObject mapObject = MapSystemWorld.GetMapObjectByBody(result.Shape.Body);
if (mapObject != null) { if (mapObject == this) continue; if (mapObject == this.AttachedMapObjectParent) continue; }
obj.Position = result.Position - ray.Direction * .01f; break; } } }
Quat rot = GetBulletRotation(); Radian dispersionAngle = mode.typeMode.DispersionAngle; if (dispersionAngle != 0) { EngineRandom random = World.Instance.Random;
Mat3 matrix; matrix = Mat3.FromRotateByX(random.NextFloat() * MathFunctions.PI * 2); matrix *= Mat3.FromRotateByZ(random.NextFloat() * dispersionAngle);
rot *= matrix.ToQuat(); } mode.typeMode.FireObjects[0].Rotation = mainGun.RotationOffset; mode.typeMode.FireObjects.CreateObjects(this); obj.Rotation = rot;
obj.PostCreate();
float coef = obj.DamageCoefficient; Unit unit = GetParentUnitHavingIntellect(); if (unit != null && unit.BigDamageInfluence != null) coef *= unit.BigDamageInfluence.Type.Coefficient; obj.DamageCoefficient = coef; }
/*---------------Вычисление позиции на поворот для пушки--------------*/ public Vec3 GetNeedPositionToTurnGun() {
RayCastResult results = PhysicsWorld.Instance.RayCast( RendererWorld.Instance.DefaultCamera.GetCameraToViewportRay(EngineApp.Instance.MousePosition), (int)ContactGroup.CastOnlyContact);
if (results.Position == Vec3.Zero) { return Vec3.Zero; }
return results.Position; }
protected override void OnTick() { base.OnTick();
if (EngineApp.Instance.IsMouseButtonPressed(EMouseButtons.Left)) if ((LastTickTime - lastFireTime) > 0.08f) { CreateBullet(NormalMode); lastFireTime = LastTickTime; }
TurnMainGun(); }
} } Добавлено (08.06.2013, 10:06) --------------------------------------------- http://rghost.ru/46595574
Тот же код на обменнике, чтобы было удобней смотреть) Не знал что тут такое маленькое окошко
|
|
| |
Cyber | Дата: Понедельник, 03 Июня 2013, 17:54 | Сообщение # 15 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| Вы немного не так меня поняли, Я знаю что у оружия есть параметр разброса пуль (DispersionAngle или как то так). А задача другая - есть точка на террейне, и есть позиция оружия, нужно высчитать поворот по всем трем осям координат, по X и Y координатам поворот считается на ура, а вот по Z оси, оружие стреляет чуть выше чем хотелось бы. Не знаю в чем проблема, вроде геометрию знаю пространственную)
И да, пишу свое, вертолетное орудие, пулемет. Напрявляется мышкой, точку на террейне считаю через вьювпорт. А код правильного рассчета поворота в точку указанную мышкой,ну или на мысль правильную по этому поводу наведите хотя бы
Сообщение отредактировал Cyber - Понедельник, 03 Июня 2013, 17:57 |
|
| |
Cyber | Дата: Воскресенье, 02 Июня 2013, 14:17 | Сообщение # 16 | Тема: Rotation в NeoAxis |
был не раз
Сейчас нет на сайте
| Нужно чтобы пуля попадала в террейн куда указывает курсор. Сделал вычисление Rotation для этого через тригонометрические функции и векторную математику, но пуля попадает постоянно выше того места куда должна попасть. В чем проблема? Может из за перепада высот террейна? И можно ли получить нужное значение Rotation через вектор указывающий направление (Direction), если да то можете привести код в пример?
|
|
| |
|