Elite Games - Свобода среди звезд!
.
  » Техническая помощь в реализации самописных игр | страница 2
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 2 из 15
На страницу: Пред.  1, 2, 3, ... 13, 14, 15  След.    Перейти:   Все страницы
Поиск в этой теме:
Канал Игры Мечты: «Техническая помощь в реализации самописных игр»
ТехноМаг
 310 EGP


Рейтинг канала: 1(9)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Michael_Moon :
а все остальное - сплошные условности, как-то комично такая реалистичность выглядеть начинает.


Не забывай, что такая комичность может быть специальной. Это все зависит от того, как именно видит проект разработчик.

Для примера могу привести новый боевик (не игра, правдо) с Ривзом в главной роли, где все держится на комичности (даже нелепости) происходящего.

Как говорят некоторые разрабы "главное экшон" (с)
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."

Последний раз редактировалось: ТехноМаг (19:30 26-01-2015), всего редактировалось 1 раз
    Добавлено: 19:30 26-01-2015   
Michael_Moon
 92 EGP

Рейтинг канала: 1(2)
Репутация: -2
Сообщения: 669
Откуда: РК, Кокшетау
Зарегистрирован: 15.02.2011
ТехноМаг :
Michael_Moon :
а все остальное - сплошные условности, как-то комично такая реалистичность выглядеть начинает.


Не забывай, что такая комичность может быть специальной. Это все зависит от того, как именно видит проект разработчик.

Для примера могу привести новый боевик (не игра, правдо) с Ривзом в главной роли, где все держится на комичности (даже нелепости) происходящего.

Как говорят некоторые разрабы "главное экшон" (с)

Комизм - это ОЧЕНЬ тонкий юмор, который, в этом случае, должен быть выдержан во всем (я сейчас про игру говорю). Мне не кажется достоверной возможность написания ТАКОГО концепта и ТАКОГО сценария - слишком это все должно быть гениально, типа Марка Твена, О'Генри, Эльфа Петрова, Зощенко, Аверченко или даже (что ближе) Гайдая. Художники не делают игры, а девелоперы не бывают художниками - это аксиома Улыбка
    Добавлено: 20:01 26-01-2015   
ТехноМаг
 310 EGP


Рейтинг канала: 1(9)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Michael_Moon :
Художники не делают игры, а девелоперы не бывают художниками - это аксиома


Игру делает Game-дизайнер. А уже по его писанине художники рисуют, актеры звучат, а прогеры страдают. А вся эта кухня называется девелоперами.

И вот что Гдизер там настрочил в документации, какие возможности предусмотрел, а какие проигнорировал введя условности (или просто проигнорировал), то и будут делать прогеры, со всеми вытекающими. Что из этого получается... ну X-Reberth в принципе можно считать за пример (хотя там не только Гдизер настрадал).

Поясню. Если в документе написано, что при прыжке у героя должна проигрываться анимация плавания (да, и такие абсурды бывают), то так и будет сделано (и объявлено фичей).
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."

Последний раз редактировалось: ТехноМаг (20:21 26-01-2015), всего редактировалось 1 раз
    Добавлено: 20:16 26-01-2015   
Michael_Moon
 92 EGP

Рейтинг канала: 1(2)
Репутация: -2
Сообщения: 669
Откуда: РК, Кокшетау
Зарегистрирован: 15.02.2011
ТехноМаг :
И вот что Гдизер там настрочил в документации, какие возможности предусмотрел, а какие проигнорировал введя условности (или просто проигнорировал), то и будут делать прогеры, со всеми вытекающими. Что из этого получается... ну X-Reberth в принципе можно считать за пример (хотя там не только Гдизер настрадал).

Мне без разницы, как ты назовешь девелопера - гдизером ли, альбо еще каким детерминистом (это все роли ругательные, и я попрошу их ко мне не применять (почти цитата)). Факт заключается в том, что ни одного хорошего юмориста я среди них не встречал, т.к. не встречал даже упоминания о хорошей ЮМОРИСТИЧЕСКОЙ игре. Хотя попыток было много, да.
    Добавлено: 20:26 26-01-2015   
БулерМэн
 390 EGP


Рейтинг канала: 2(21)
Репутация: 64
Сообщения: 1580
Откуда: Гороховец
Зарегистрирован: 07.02.2006
Наша скромная ветка форума конечно не претендует на альмаматер игростроя, но все же - выкладывайте диздоки, поможем чем сможем Улыбка
Быть соучастником в написании диздока, описания игры, думаю здесь желающих не найдется, поэтому предлагаю здесь оказывать помощь в технических вопросах, что-то нарисовать, что-то запрограммировать(прототип например), озвучить и прочее.

Собственно можно было бы отдельной темой просить помощи, но мужики то не знают, что так можно сделать Гы-гы Все как-то сами стараются Улыбка

Последний раз редактировалось: БулерМэн (19:24 27-01-2015), всего редактировалось 1 раз
    Добавлено: 19:23 27-01-2015   
Michael_Moon
 92 EGP

Рейтинг канала: 1(2)
Репутация: -2
Сообщения: 669
Откуда: РК, Кокшетау
Зарегистрирован: 15.02.2011
ОК, в плане технической реализации проекта подскажите, где рыть для сращивания Юнити и ini-формата для рисования ГУИ. И стоит ли это вообще делать в юньке, учитывая, что конечная графическая форма ГУИ-объектов пока неизвестна?
    Добавлено: 20:31 27-01-2015   
ТехноМаг
 310 EGP


Рейтинг канала: 1(9)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Michael_Moon :
где рыть для сращивания Юнити и ini-формата


xml`ка в этом плане будет гораздо удобнее.

Если не ошибаюсь, то можно вот таким образом: http://igroman14.livejournal.com/116218.html
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."

Последний раз редактировалось: ТехноМаг (20:35 27-01-2015), всего редактировалось 1 раз
    Добавлено: 20:33 27-01-2015   
Olorin
 70 EGP


Рейтинг канала: 1(6)
Репутация: 12
Сообщения: 97
Откуда: Хьёрвард
Зарегистрирован: 27.02.2006
БулерМэн :
что-то запрограммировать(прототип например)

Ок. Хы...

Есть: модель, описывающая корпус примерно в таком вот виде - http://pastebin.com/vf2WnwWu
Надо: построить полигональную модель по такому описанию (в рендеринг - пачки треугольных полигонов).
Для: прототипного редактора корабликов (ближайшая цель - довести его ui в виде wpf-приложения до юзабельного состояния, чтоб потом встроить в возможную игру, где на эти модели будет разная механика завязана).

Пока выглядит так Гы-гы
 Cкрытый текст   (кликните здесь для просмотра)

_________________
Мы на многое не отваживаемся не потому что оно трудно; оно трудно именно потому, что мы на него не отваживаемся.
Сенека Старший
    Добавлено: 21:13 27-01-2015   
ТехноМаг
 310 EGP


Рейтинг канала: 1(9)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Olorin :
Есть: модель, описывающая корпус примерно в таком вот виде


Цитата:
Доступ к сайту ограничен в соответствии с Федеральными законами №114-ФЗ от 25.07.2002


ататат

скопипасти модель под кат. VPN лень подниматьУлыбка
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."

Последний раз редактировалось: ТехноМаг (21:18 27-01-2015), всего редактировалось 1 раз
    Добавлено: 21:15 27-01-2015   
Olorin
 70 EGP


Рейтинг канала: 1(6)
Репутация: 12
Сообщения: 97
Откуда: Хьёрвард
Зарегистрирован: 27.02.2006
ТехноМаг :
Olorin :
Есть: модель, описывающая корпус примерно в таком вот виде


Цитата:
Доступ к сайту ограничен в соответствии с Федеральными законами №114-ФЗ от 25.07.2002


ататат

скопипасти модель под кат. VPN лень подниматьУлыбка

Внезапно.)))

И так и так:
http://pastebin.mozilla-russia.org/111746
 Cкрытый текст   (кликните здесь для просмотра)

Код:

    /// <summary>
    /// Материал корпуса
    /// </summary>
    public class HullMaterial
    {
        public Color Color { get; set; }
        public string Name { get; set; }

        public HullMaterial(string name, Color color)
        {
            this.Name = name;
            this.Color = color;
        }

        public static HullMaterial Unserial(XmlElement el)
        {
            if (el.Name != "HullMaterial")
                throw new ArgumentException();

            return new HullMaterial(
                el.Attributes["Name"].Value,
                (Color)ColorConverter.ConvertFromString(el.Attributes["Color"].Value)
            );
        }

        public void SerialTo(XmlElement targetElement)
        {
            var el = targetElement.OwnerDocument.CreateElement("HullMaterial");
            el.SetAttribute("Name", this.Name);
            el.SetAttribute("Color", this.Color.ToString());
            targetElement.AppendChild(el);
        }
    }

    /// <summary>
    /// Вид балки скелета
    /// </summary>
    public class FixtureKind
    {
        public string Name { get; set; }
        public HullMaterial Material { get; set; }

        /// <summary>
        /// Размер сечения балки
        /// </summary>
        public double Size { get; private set; }

        public FixtureKind(string name, HullMaterial material, double size)
        {
            this.Name = name;
            this.Size = size;
            this.Material = material;
        }

        public static FixtureKind Unserial(XmlElement el, Hull hull)
        {
            if (el.Name != "FixtureKind")
                throw new ArgumentException();

            var materialName = el.Attributes["Material"].Value;

            return new FixtureKind(
               el.Attributes["Name"].Value,
               hull.Materials.First(m => m.Name == materialName),
               double.Parse(el.Attributes["Size"].Value)
            );
        }

        public void SerialTo(XmlElement targetElement)
        {
            var el = targetElement.OwnerDocument.CreateElement("FixtureKind");
            el.SetAttribute("Name", this.Name);
            el.SetAttribute("Size", this.Size.ToString());
            el.SetAttribute("Material", this.Material.Name);
            targetElement.AppendChild(el);
        }
    }

    /// <summary>
    /// Балка скелета
    /// </summary>
    public class Fixture
    {
        static readonly Point3DConverter _pointsConverter = new Point3DConverter();

        public Point3D From { get; set; }
        public Point3D To { get; set; }

        public FixtureKind Kind { get; private set; }

        public Fixture(FixtureKind kind, Point3D from, Point3D to)
        {
            this.Kind = kind;
            this.From = from;
            this.To = to;
        }

        public static Fixture Unserial(XmlElement el, Hull hull)
        {
            if (el.Name != "Fixture")
                throw new ArgumentException();

            var fixtureKindName = el.Attributes["Kind"].Value;

            return new Fixture(
               hull.FixtureKinds.First(m => m.Name == fixtureKindName),
               (Point3D)_pointsConverter.ConvertFromString(el.Attributes["From"].Value),
               (Point3D)_pointsConverter.ConvertFromString(el.Attributes["To"].Value)
            );
        }

        public void SerialTo(XmlElement targetElement)
        {
            var el = targetElement.OwnerDocument.CreateElement("Fixture");
            el.SetAttribute("Kind", this.Kind.Name);
            el.SetAttribute("From", _pointsConverter.ConvertToString(this.From));
            el.SetAttribute("To", _pointsConverter.ConvertToString(this.To));
            targetElement.AppendChild(el);
        }
    }

    /// <summary>
    /// Режим интерполяции точек фрагмента обшивки
    /// </summary>
    public enum CoverFragmentInterpolation
    {
        /// <summary>
        /// Строить ломаную через заданные точки
        /// </summary>
        None,
        /// <summary>
        /// Строить приближенную кривую, интерпполируя промежуточные точки с помощью кривой Безье на основе заданных
        /// </summary>
        Bezier
    }

    /// <summary>
    /// Фрагмент обшивки
    /// </summary>
    public class CoverFragment
    {
        List<Point3D> _points;
        public IList<Point3D> Points { get { return _points; } }

        public HullMaterial Material { get; set; }
        public CoverFragmentInterpolation Interpolation { get; set; }

        public CoverFragment(HullMaterial material, params Point3D[] points)
        {
            _points = new List<Point3D>(points);
            this.Material = material;
            this.Interpolation = CoverFragmentInterpolation.None;
        }


    }

    /// <summary>
    /// Форма шлюза
    /// </summary>
    public abstract class GateJointShape
    {
        /// <summary>
        /// Глубина шлюза
        /// </summary>
        public double Depth { get; set; }

        public GateJointShape(double depth)
        {
            this.Depth = depth;
        }
    }

    /// <summary>
    /// Круг\Эллипсоид
    /// </summary>
    public class EllipsoidGateJointShape : GateJointShape
    {
        public double InternalRadius { get; set; }
        public double ExternalRadius { get; set; }

        public EllipsoidGateJointShape(double internalRadius, double externalRadius, double depth)
            : base(depth)
        {
            this.InternalRadius = internalRadius;
            this.ExternalRadius = externalRadius;
        }
    }

    /// <summary>
    /// Параллелепипед
    /// </summary>
    public class RectGateJointShape : GateJointShape
    {
        public double Height { get; set; }
        public double Width { get; set; }

        /// <summary>
        /// Радиус скругления углов шлюза, если задано.
        /// </summary>
        public double? RoundRadius { get; set; }

        public RectGateJointShape(double height, double width, double depth)
            : base(depth)
        {
            this.Height = height;
            this.Width = width;
            this.RoundRadius = null;
        }
    }

    /// <summary>
    /// Многоугольный шлюз
    /// </summary>
    public class PolyGateJointShape : RectGateJointShape
    {
        /// <summary>
        /// Количество уголов.
        /// <remarks>
        /// Для нечетного непарная вершина всегда сверху.
        /// Вершины располагаются по полокружиям радиуса Height, расстояние меж полукружиями Width.
        /// </remarks>
        /// </summary>
        public int VerticesCount { get; set; }

        public PolyGateJointShape(double height, double width, int verticesCount, double depth)
            : base(height, width, depth)
        {
            this.VerticesCount = verticesCount;
        }
    }

    /// <summary>
    /// Расположение шлюза отсека
    /// </summary>
    public class GateJoint
    {
        public HullMaterial Material { get; set; }
        public GateJointShape Shape { get; set; }

        public Point3D Position { get; set; }

        public GateJoint(HullMaterial material)
        {
            this.Material = material;
        }
    }

    /// <summary>
    /// Плоскость в пространстве
    /// </summary>
    public class Plane
    {
        public Vector3D Normal { get; private set; }
        public double Distance { get; private set; }

        public Plane(Vector3D normal, double distance)
        {
            this.Normal = normal;
            this.Distance = distance;
        }
    }

    /// <summary>
    /// Полигон на плоскости в пространстве.
    /// Все точки принадлежат первоначально заданной плоскости.
    /// </summary>
    public class Polygon
    {
        List<Point3D> _points = new List<Point3D>();
        public IEnumerable<Point3D> Points { get { return _points; } }

        List<GateJoint> _gates = new List<GateJoint>();
        public IEnumerable<GateJoint> Gates { get { return _gates; } }

        public HullMaterial Material { get; set; }

        public Plane Plane { get; private set; }

        public Polygon(HullMaterial material, Point3D a, Point3D b, Point3D c)
        {
            this.Material = material;

            var n = Vector3D.CrossProduct(b - a, c - b);
            n.Normalize();
            var dst = (a.X * n.X + a.Y * n.Y + a.Z * n.Z);
            this.Plane = new Plane(n, dst);
        }

        public void Add(Point3D p)
        {
            // project point to plane
            var n = this.Plane.Normal;
            var d = (p.X * n.X + p.Y * n.Y + p.Z * n.Z); // distance from zero to plane throug point
            var dst = d - this.Plane.Distance; // distance between planes
            var off = n * dst; // projection vector
            var pt = p + off;
            _points.Add(pt);
        }

        public void Add(GateJoint gate)
        {
            // форма шлюза должна помещаться внутри полигона
            _gates.Add(gate);
        }
    }

    /// <summary>
    /// Шаблон отсека
    /// </summary>
    public class RoomTemplate
    {
        public string Name { get; set; }

        List<Polygon> _planes = new List<Polygon>();
        public IEnumerable<Polygon> Planes { get { return _planes; } }

        // OXPlane, OYPlane, OZPlane - плоскости разбиения, разделяющие группы вершин в направлениях масштабирования
        // При масштабировании в некотором направлении, соответствующие группы вершин раздвигаются в противоположные стороны с сохранением полигональной сетки.

        public Plane OXPlane { get; set; }
        public Plane OYPlane { get; set; }
        public Plane OZPlane { get; set; }

        public RoomTemplate(string name)
        {
            this.Name = name;
        }
    }

    /// <summary>
    /// Отсек
    /// </summary>
    public class Room
    {
        public string Name { get; set; }

        public Point3D Position { get; set; }

        /// <summary>
        /// Добавочный размер, соответствующий масштабированию шаблона через раздвижение в соответствиями с плоскостями разбиения
        /// </summary>
        public Vector3D ExtraSize { get; set; }

        public RoomTemplate Template { get; private set; }

        public Room(string name, RoomTemplate template, Point3D position)
        {
            this.Name = name;
            this.Template = template;
            this.Position = position;
        }
    }

    /// <summary>
    /// Корпус
    /// </summary>
    public class Hull : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged = delegate { };

        public string Name { get; set; }

        // словари применены только для упрощения индексации при редактировании структуры модели

        Dictionary<string, HullMaterial> _materials = new Dictionary<string, HullMaterial>();
        public IEnumerable<HullMaterial> Materials { get { return _materials.Values; } }

        Dictionary<string, FixtureKind> _fixtureKinds = new Dictionary<string, FixtureKind>();
        public IEnumerable<FixtureKind> FixtureKinds { get { return _fixtureKinds.Values; } }

        Dictionary<GeometryModel3D, Fixture> _fixtures = new Dictionary<GeometryModel3D, Fixture>();
        public IEnumerable<Fixture> Fixtures { get { return _fixtures.Values; } }

        Dictionary<GeometryModel3D, Room> _rooms = new Dictionary<GeometryModel3D, Room>();
        public IEnumerable<Room> Rooms { get { return _rooms.Values; } }

        Dictionary<string, RoomTemplate> _roomTemplates = new Dictionary<string, RoomTemplate>();
        public IEnumerable<RoomTemplate> RoomTemplates { get { return _roomTemplates.Values; } }

        Dictionary<GeometryModel3D, CoverFragment> _coverings = new Dictionary<GeometryModel3D, CoverFragment>();
        public IEnumerable<CoverFragment> Coverings { get { return _coverings.Values; } }



        public Hull(string name)
        {
            this.Name = name;
        }

        private void RaizePropertyChanged(string propName)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }

        public void AddMaterial(HullMaterial material)
        {
            _materials.Add(material.Name, material);
            this.RaizePropertyChanged("Materials");
        }

        public void AddFixtureKind(FixtureKind kind)
        {
            _fixtureKinds.Add(kind.Name, kind);
            this.RaizePropertyChanged("FixtureKinds");
        }

        public void AddFixture(GeometryModel3D model, Fixture fixture)
        {
            _fixtures.Add(model, fixture);
            this.RaizePropertyChanged("Fixtures");
        }

        public void AddRoom(GeometryModel3D model, Room room)
        {
            _rooms.Add(model, room);
            this.RaizePropertyChanged("Rooms");
        }

        public void AddRoomTemplate(RoomTemplate roomTemplate)
        {
            _roomTemplates.Add(roomTemplate.Name, roomTemplate);
            this.RaizePropertyChanged("RoomTemplates");
        }

        public void AddCover(GeometryModel3D model, CoverFragment cover)
        {
            _coverings.Add(model, cover);
            this.RaizePropertyChanged("Coverings");
        }

        public static Hull Unserial(XmlElement root)
        {
            var culture = Thread.CurrentThread.CurrentCulture;
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; ;

            try
            {

                if (root.Name != "Hull")
                    throw new ArgumentException();

                var hull = new Hull(root.Attributes["Name"].Value);

                foreach (XmlElement el in root.GetElementsByTagName("HullMaterial"))
                    hull.AddMaterial(HullMaterial.Unserial(el));

                foreach (XmlElement el in root.GetElementsByTagName("FixtureKind"))
                    hull.AddFixtureKind(FixtureKind.Unserial(el, hull));

                foreach (XmlElement el in root.GetElementsByTagName("Fixture"))
                {
                    var f = Fixture.Unserial(el, hull);
                    hull.AddFixture(f.MakeGeometry(), f);
                }

                //foreach (XmlElement el in root.GetElementsByTagName("RoomTemplate"))
                //    hull.AddRoomTemplate(RoomTemplate.Unserial(el, hull));

                //foreach (XmlElement el in root.GetElementsByTagName("Room"))
                //{
                //    var r = Room.Unserial(el, hull);
                //    hull.AddRoom(r.MakeGeometry(), r);
                //}

                //foreach (XmlElement el in root.GetElementsByTagName("CoverFragment"))
                //{
                //    var c = CoverFragment.Unserial(el, hull);
                //    hull.AddCover(c.MakeGeometry(), c);
                //}
                return hull;
            }
            finally
            {
                Thread.CurrentThread.CurrentCulture = culture;
            }
        }

        public XmlDocument Serial()
        {
            var culture = Thread.CurrentThread.CurrentCulture;
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; ;
            try
            {
                var doc = new XmlDocument();
                doc.AppendChild(doc.CreateXmlDeclaration("1.0", "utf-8", null));
                var root = doc.CreateElement("Hull");
                doc.AppendChild(root);
                root.SetAttribute("Name", this.Name);

                foreach (var item in _materials.Values)
                    item.SerialTo(root);

                foreach (var item in _fixtureKinds.Values)
                    item.SerialTo(root);

                foreach (var item in _fixtures.Values)
                    item.SerialTo(root);

                //foreach (var item in _roomTemplates.Values)
                //    item.SerialTo(root);

                //foreach (var item in _rooms.Values)
                //    item.SerialTo(root);

                //foreach (var item in _coverings.Values)
                //    item.SerialTo(root);

                return doc;
            }
            finally
            {
                Thread.CurrentThread.CurrentCulture = culture;
            }
        }
    }


_________________
Мы на многое не отваживаемся не потому что оно трудно; оно трудно именно потому, что мы на него не отваживаемся.
Сенека Старший
    Добавлено: 21:21 27-01-2015   
ТехноМаг
 310 EGP


Рейтинг канала: 1(9)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Olorin :
построить полигональную модель по такому описанию (в рендеринг - пачки треугольных полигонов).


Законный вопрос: А зачем такие сложности?

1) Что в итоге должно получится?
2) Как планируется встраивать это в игру?
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 21:29 27-01-2015   
БулерМэн
 390 EGP


Рейтинг канала: 2(21)
Репутация: 64
Сообщения: 1580
Откуда: Гороховец
Зарегистрирован: 07.02.2006
есть предположение, что для упрощения процесса моделирования, то есть без 3dsmax'ов и прочих редакторов сразу в свой формат. Что-то типа "процедурной" геометрии корпуса, нет? Подозрение.
    Добавлено: 21:38 27-01-2015   
ТехноМаг
 310 EGP


Рейтинг канала: 1(9)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
БулерМэн :
без 3dsmax'ов и прочих редакторов сразу в свой формат. Что-то типа "процедурной" геометрии корпуса, нет?


Ну это видно, да. Но я таки не понял с какой целью это все создается? Ведь в случае своего формата придется достаточно много велосипедов рисовать. Иерархию, анимацию, фреймы, информацию о материале, и прочее.

Ради процедурной генерации полной модели корабля (тут опять не понятно будет ли разделение екстерьера и интерьера) я не вижу смысла все это строить, тем более через построение кривых.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 21:47 27-01-2015   
Olorin
 70 EGP


Рейтинг канала: 1(6)
Репутация: 12
Сообщения: 97
Откуда: Хьёрвард
Зарегистрирован: 27.02.2006
ТехноМаг :
Законный вопрос: А зачем такие сложности?

1) Что в итоге должно получится?
2) Как планируется встраивать это в игру?

1)
В рамках задачки должно получиться несколько пачек полигонов для частей модели.
В рамках идеи - нормальный редактор моделей в такой вот форме, модельки из которого потом для начала буду учить перемещаться в пространстве, а там как пойдет. Не вижу смысла закладываться сразу на фичелист, хочется-то много.)
2)
В игру будет встраиваться не этот редактор целиком, а части его кода (модель корабля, которая еще эволюционировать будет в любом случае, построение визуальной модели(сабж), возможно фрагменты внутренней логики ui, когда двиг будущего основного проекта созреет до высокоуровневого ui.

В перспективе из такой примитивной модельки можно много всякой инфы вытянуть для разной логики: физическую модель, отстреливание частей корпуса, объем места для грузов/оборудования, если очень захочется - внутренний интерьер, на основе шаблонов отсеков генератор кораблей сделать, и т.п. Это с точки зрения игромеха. Если его выкинуть из головы, в таких терминах не-моделлеру и руками наклепать моделек проще будет, так что оно многоцелевое.

добавлено спустя 41 минуту:
ТехноМаг :
БулерМэн :
без 3dsmax'ов и прочих редакторов сразу в свой формат. Что-то типа "процедурной" геометрии корпуса, нет?


Ну это видно, да. Но я таки не понял с какой целью это все создается? Ведь в случае своего формата придется достаточно много велосипедов рисовать. Иерархию, анимацию, фреймы, информацию о материале, и прочее.

Ради процедурной генерации полной модели корабля (тут опять не понятно будет ли разделение екстерьера и интерьера) я не вижу смысла все это строить, тем более через построение кривых.

Количество велосипедов несколько уменьшается, если не хотеть всего и сразу. Улыбка

Кривые для упрощения: задаем опорные точки в непокрытых местах корпуса и вуаля, гладкая обшивка готова. Вручную лепить - замучаешься, процедурно - всё равно через кривые в каком-то их виде, если не хотеть ограничиваться летающими нагромождениями кубиков.
_________________
Мы на многое не отваживаемся не потому что оно трудно; оно трудно именно потому, что мы на него не отваживаемся.
Сенека Старший

Последний раз редактировалось: Olorin (22:36 27-01-2015), всего редактировалось 1 раз
    Добавлено: 22:36 27-01-2015   
ТехноМаг
 310 EGP


Рейтинг канала: 1(9)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Olorin :
если не хотеть ограничиваться летающими нагромождениями кубиков.


Smooth модификатор на общие грани, не? Подозрение.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 22:45 27-01-2015   
Olorin
 70 EGP


Рейтинг канала: 1(6)
Репутация: 12
Сообщения: 97
Откуда: Хьёрвард
Зарегистрирован: 27.02.2006
ТехноМаг :
Smooth модификатор на общие грани, не? Подозрение.

Еслиб была задача замоделить N моделей, или идея, упирающаяся в такую задачу, яб про неё и написал в самом начале. Улыбка
_________________
Мы на многое не отваживаемся не потому что оно трудно; оно трудно именно потому, что мы на него не отваживаемся.
Сенека Старший
    Добавлено: 00:06 28-01-2015   
Sh.Tac.
 145 EGP


Рейтинг канала: 5(108)
Репутация: 14
Сообщения: 1425

Зарегистрирован: 27.07.2005
кубики это труЪ, а моделлеры не нужны, да Улыбка
_________________
This is what you get ...
(c) Radiohead
    Добавлено: 00:08 28-01-2015   
ТехноМаг
 310 EGP


Рейтинг канала: 1(9)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Olorin :
Еслиб была задача замоделить N моделей


Не,не. Я ничего не говорю, просто предлагаю более простые пути Улыбка

Если действительно надо через кривые, начит будут кривые.

Sh.Tac. :
кубики это труЪ, а моделлеры не нужны, да


Вот лишь бы сказать, да?

Кубики в такой реализации, и если не требуется Вау графона больше всего подходят за основу, по которой можно изогнуть корпус уже так, как нужн. Да и CPU/GPU затрат на это будет меньше, ибо у нас сразу наборчик поверхностей будет и индексов. А как мы позиции точек менять будем это уже пофигу. В случае с кривыми нужно будет точки объединять в треугольники, высчитывать общие точки полученных треугольников и собирать массив индексного буфера.

А, кстати. Текстурная развертка на это дело планируется? Или только цветом материал Будешь показывать?
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."

Последний раз редактировалось: ТехноМаг (00:20 28-01-2015), всего редактировалось 1 раз
    Добавлено: 00:19 28-01-2015   
Olorin
 70 EGP


Рейтинг канала: 1(6)
Репутация: 12
Сообщения: 97
Откуда: Хьёрвард
Зарегистрирован: 27.02.2006
ТехноМаг :

Кубики в такой реализации, и если не требуется Вау графона больше всего подходят за основу, по которой можно изогнуть корпус уже так, как нужн.

Так и есть. Обшивка же не в воздухе висит, а цепляется на внутренности, но именно цепляется. Т.е. юзер задает фрагмент обшивки последовательностью точек на непокрытых/торчащих отсеках/скелете. Так же как отсеки цепляются друг за друга шлюзами и за скелет остальными поверхностями. Эти ограничения логикой редактора будут соблюдаться.

Простой "кубизм" как-то приелся уже, тысячи их (Corneroids и иже с ним). Потом хочется поиграться с полигональными сетками, но это пока мысли. Улыбка

ТехноМаг :
Да и CPU/GPU затрат на это будет меньше, ибо у нас сразу наборчик поверхностей будет и индексов. А как мы позиции точек менять будем это уже пофигу. В случае с кривыми нужно будет точки объединять в треугольники, высчитывать общие точки полученных треугольников и собирать массив индексного буфера.

Там потому так и заложено, чтоб можно было способы описания поверхностей добавлять. От той же кривой (кривых) на опорных точках можно разными способами оттолкнуться чтоб поверхность задать. Высчитывать-то по любому - попадания определять например.

ТехноМаг :
А, кстати. Текстурная развертка на это дело планируется? Или только цветом материал Будешь показывать?

Угу. Цвета пока за глаза и за уши. Максимум, потом уже, - однородная поверхность, а пока не зачем.
_________________
Мы на многое не отваживаемся не потому что оно трудно; оно трудно именно потому, что мы на него не отваживаемся.
Сенека Старший

Последний раз редактировалось: Olorin (01:08 28-01-2015), всего редактировалось 1 раз
    Добавлено: 00:46 28-01-2015   
БулерМэн
 390 EGP


Рейтинг канала: 2(21)
Репутация: 64
Сообщения: 1580
Откуда: Гороховец
Зарегистрирован: 07.02.2006
Olorin :
Там потому так и заложено, чтоб можно было способы описания поверхностей добавлять.

А собственно, что мешает всю логику относительно генерации поверхности корабля выделить в отдельный блок кода и не трогать его пока не будет реализован весь остальной "простой кубизм" который уже всем приелся? Улыбка
Мне кажется, что фичу игры лучше добавлять к более менее реализованному проекту, чем отсекать лишнее от монолита и добиваться работоспособности всего в целом. На не структурированный подход, без выделения блоков - уйдет больше времени и сил. Сейчас у тебя кусок кода отвечает за генерацию поверхности по кривой, а потом у тебя появится какая-либо необходимость что-то изменить и полезут баги - так как данная фича это не отдельное нечто, не какой-либо "модификатор", а часть общего кода, который жестко вшит.

добавлено спустя 5 минут:
--
Кстати, а не проще ли игроку в этом случае - лепить поверхность кораблика не по кривой, а брать этот треугольник и перетаскиванием прицеплять на другой треугольник?
Просто с точки зрения сложности кода - такой подход с перетаскиванием и заготовками - намного проще, имхо.

добавлено спустя 6 минут:
--
Если представить, что у тебя уже есть код, который генерирует поверхность из треугольников то появляется резонный вопрос - а как сделать так, чтобы количество треугольников было одинаковым по всей поверхности модельки? Улыбка
Допускаю, что у тебя все треугольники подгоняются в размерах, "тянутся" и создают гладкую поверхность. Но от того, что они разные каким образом ты будешь автоматом подгонять текстуру?

А вот если взять готовые куски, то на готовый кусок можно сделать стандартную текстуру или несколько. Да, возможно будет угловато, но тут уж надо для себя решить, что ты хочешь:
а) проще реализовать программисту + долго рисовать игроку
б) сложнее реализовать программисту + быстро рисовать игроку.

добавлено спустя 3 минуты:
Эта задачка на уровне "придумай свой 3d-редактор" в котором можно изгибать поверхности потягивая за "узлы". Сложновато, имхо.

Последний раз редактировалось: БулерМэн (21:22 29-01-2015), всего редактировалось 4 раз(а)
    Добавлено: 21:22 29-01-2015   
Канал Игры Мечты: «Техническая помощь в реализации самописных игр»
На страницу: Пред.  1, 2, 3, ... 13, 14, 15  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Осторожно, тема закрывается. (Scanka)

  » Техническая помощь в реализации самописных игр | страница 2
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18