ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Техническая помощь в реализации самописных игр | страница 2 |
|
|
|
Канал Игры Мечты: «Техническая помощь в реализации самописных игр» |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Michael_Moon : |
а все остальное - сплошные условности, как-то комично такая реалистичность выглядеть начинает.
|
Не забывай, что такая комичность может быть специальной. Это все зависит от того, как именно видит проект разработчик.
Для примера могу привести новый боевик (не игра, правдо) с Ривзом в главной роли, где все держится на комичности (даже нелепости) происходящего.
Как говорят некоторые разрабы "главное экшон" (с)
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (19:30 26-01-2015), всего редактировалось 1 раз |
|
|
Michael_Moon 100 EGP
Рейтинг канала: 1(2) Репутация: -2 Сообщения: 669 Откуда: РК, Кокшетау Зарегистрирован: 15.02.2011 |
|
ТехноМаг : |
Michael_Moon : |
а все остальное - сплошные условности, как-то комично такая реалистичность выглядеть начинает.
|
Не забывай, что такая комичность может быть специальной. Это все зависит от того, как именно видит проект разработчик.
Для примера могу привести новый боевик (не игра, правдо) с Ривзом в главной роли, где все держится на комичности (даже нелепости) происходящего.
Как говорят некоторые разрабы "главное экшон" (с)
|
Комизм - это ОЧЕНЬ тонкий юмор, который, в этом случае, должен быть выдержан во всем (я сейчас про игру говорю). Мне не кажется достоверной возможность написания ТАКОГО концепта и ТАКОГО сценария - слишком это все должно быть гениально, типа Марка Твена, О'Генри, Эльфа Петрова, Зощенко, Аверченко или даже (что ближе) Гайдая. Художники не делают игры, а девелоперы не бывают художниками - это аксиома
|
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Michael_Moon : |
Художники не делают игры, а девелоперы не бывают художниками - это аксиома
|
Игру делает Game-дизайнер. А уже по его писанине художники рисуют, актеры звучат, а прогеры страдают. А вся эта кухня называется девелоперами.
И вот что Гдизер там настрочил в документации, какие возможности предусмотрел, а какие проигнорировал введя условности (или просто проигнорировал), то и будут делать прогеры, со всеми вытекающими. Что из этого получается... ну X-Reberth в принципе можно считать за пример (хотя там не только Гдизер настрадал).
Поясню. Если в документе написано, что при прыжке у героя должна проигрываться анимация плавания (да, и такие абсурды бывают), то так и будет сделано (и объявлено фичей).
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (20:21 26-01-2015), всего редактировалось 1 раз |
|
|
Michael_Moon 100 EGP
Рейтинг канала: 1(2) Репутация: -2 Сообщения: 669 Откуда: РК, Кокшетау Зарегистрирован: 15.02.2011 |
|
ТехноМаг : |
И вот что Гдизер там настрочил в документации, какие возможности предусмотрел, а какие проигнорировал введя условности (или просто проигнорировал), то и будут делать прогеры, со всеми вытекающими. Что из этого получается... ну X-Reberth в принципе можно считать за пример (хотя там не только Гдизер настрадал).
|
Мне без разницы, как ты назовешь девелопера - гдизером ли, альбо еще каким детерминистом (это все роли ругательные, и я попрошу их ко мне не применять (почти цитата)). Факт заключается в том, что ни одного хорошего юмориста я среди них не встречал, т.к. не встречал даже упоминания о хорошей ЮМОРИСТИЧЕСКОЙ игре. Хотя попыток было много, да.
|
|
|
БулерМэн 420 EGP
Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006 |
|
Наша скромная ветка форума конечно не претендует на альмаматер игростроя, но все же - выкладывайте диздоки, поможем чем сможем
Быть соучастником в написании диздока, описания игры, думаю здесь желающих не найдется, поэтому предлагаю здесь оказывать помощь в технических вопросах, что-то нарисовать, что-то запрограммировать(прототип например), озвучить и прочее.
Собственно можно было бы отдельной темой просить помощи, но мужики то не знают, что так можно сделать Все как-то сами стараются
Последний раз редактировалось: БулерМэн (19:24 27-01-2015), всего редактировалось 1 раз |
|
|
Michael_Moon 100 EGP
Рейтинг канала: 1(2) Репутация: -2 Сообщения: 669 Откуда: РК, Кокшетау Зарегистрирован: 15.02.2011 |
|
ОК, в плане технической реализации проекта подскажите, где рыть для сращивания Юнити и ini-формата для рисования ГУИ. И стоит ли это вообще делать в юньке, учитывая, что конечная графическая форма ГУИ-объектов пока неизвестна?
|
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Michael_Moon : |
где рыть для сращивания Юнити и ini-формата
|
xml`ка в этом плане будет гораздо удобнее.
Если не ошибаюсь, то можно вот таким образом: http://igroman14.livejournal.com/116218.html
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (20:35 27-01-2015), всего редактировалось 1 раз |
|
|
Olorin 70 EGP
Рейтинг канала: 1(6) Репутация: 12 Сообщения: 97 Откуда: Хьёрвард Зарегистрирован: 27.02.2006 |
|
БулерМэн : |
что-то запрограммировать(прототип например)
|
Ок.
Есть: модель, описывающая корпус примерно в таком вот виде - http://pastebin.com/vf2WnwWu
Надо: построить полигональную модель по такому описанию (в рендеринг - пачки треугольных полигонов).
Для: прототипного редактора корабликов (ближайшая цель - довести его ui в виде wpf-приложения до юзабельного состояния, чтоб потом встроить в возможную игру, где на эти модели будет разная механика завязана).
Пока выглядит так
Cкрытый текст (кликните здесь для просмотра)
|
_________________ Мы на многое не отваживаемся не потому что оно трудно; оно трудно именно потому, что мы на него не отваживаемся.
Сенека Старший |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Olorin : |
Есть: модель, описывающая корпус примерно в таком вот виде
|
Цитата: |
Доступ к сайту ограничен в соответствии с Федеральными законами №114-ФЗ от 25.07.2002
|
ататат
скопипасти модель под кат. VPN лень поднимать
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (21:18 27-01-2015), всего редактировалось 1 раз |
|
|
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;
}
}
}
|
|
_________________ Мы на многое не отваживаемся не потому что оно трудно; оно трудно именно потому, что мы на него не отваживаемся.
Сенека Старший |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Olorin : |
построить полигональную модель по такому описанию (в рендеринг - пачки треугольных полигонов).
|
Законный вопрос: А зачем такие сложности?
1) Что в итоге должно получится?
2) Как планируется встраивать это в игру?
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
БулерМэн 420 EGP
Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006 |
|
есть предположение, что для упрощения процесса моделирования, то есть без 3dsmax'ов и прочих редакторов сразу в свой формат. Что-то типа "процедурной" геометрии корпуса, нет?
|
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
БулерМэн : |
без 3dsmax'ов и прочих редакторов сразу в свой формат. Что-то типа "процедурной" геометрии корпуса, нет?
|
Ну это видно, да. Но я таки не понял с какой целью это все создается? Ведь в случае своего формата придется достаточно много велосипедов рисовать. Иерархию, анимацию, фреймы, информацию о материале, и прочее.
Ради процедурной генерации полной модели корабля (тут опять не понятно будет ли разделение екстерьера и интерьера) я не вижу смысла все это строить, тем более через построение кривых.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
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 раз |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Olorin : |
если не хотеть ограничиваться летающими нагромождениями кубиков.
|
Smooth модификатор на общие грани, не?
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
Olorin 70 EGP
Рейтинг канала: 1(6) Репутация: 12 Сообщения: 97 Откуда: Хьёрвард Зарегистрирован: 27.02.2006 |
|
ТехноМаг : |
Smooth модификатор на общие грани, не? Подозрение.
|
Еслиб была задача замоделить N моделей, или идея, упирающаяся в такую задачу, яб про неё и написал в самом начале.
_________________ Мы на многое не отваживаемся не потому что оно трудно; оно трудно именно потому, что мы на него не отваживаемся.
Сенека Старший |
|
|
Sh.Tac. 151 EGP
Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005 |
|
кубики это труЪ, а моделлеры не нужны, да
_________________ This is what you get ...
(c) Radiohead |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2510 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Olorin : |
Еслиб была задача замоделить N моделей
|
Не,не. Я ничего не говорю, просто предлагаю более простые пути
Если действительно надо через кривые, начит будут кривые.
Sh.Tac. : |
кубики это труЪ, а моделлеры не нужны, да
|
Вот лишь бы сказать, да?
Кубики в такой реализации, и если не требуется Вау графона больше всего подходят за основу, по которой можно изогнуть корпус уже так, как нужн. Да и CPU/GPU затрат на это будет меньше, ибо у нас сразу наборчик поверхностей будет и индексов. А как мы позиции точек менять будем это уже пофигу. В случае с кривыми нужно будет точки объединять в треугольники, высчитывать общие точки полученных треугольников и собирать массив индексного буфера.
А, кстати. Текстурная развертка на это дело планируется? Или только цветом материал Будешь показывать?
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
Последний раз редактировалось: ТехноМаг (00:20 28-01-2015), всего редактировалось 1 раз |
|
|
Olorin 70 EGP
Рейтинг канала: 1(6) Репутация: 12 Сообщения: 97 Откуда: Хьёрвард Зарегистрирован: 27.02.2006 |
|
ТехноМаг : |
Кубики в такой реализации, и если не требуется Вау графона больше всего подходят за основу, по которой можно изогнуть корпус уже так, как нужн.
|
Так и есть. Обшивка же не в воздухе висит, а цепляется на внутренности, но именно цепляется. Т.е. юзер задает фрагмент обшивки последовательностью точек на непокрытых/торчащих отсеках/скелете. Так же как отсеки цепляются друг за друга шлюзами и за скелет остальными поверхностями. Эти ограничения логикой редактора будут соблюдаться.
Простой "кубизм" как-то приелся уже, тысячи их (Corneroids и иже с ним). Потом хочется поиграться с полигональными сетками, но это пока мысли.
ТехноМаг : |
Да и CPU/GPU затрат на это будет меньше, ибо у нас сразу наборчик поверхностей будет и индексов. А как мы позиции точек менять будем это уже пофигу. В случае с кривыми нужно будет точки объединять в треугольники, высчитывать общие точки полученных треугольников и собирать массив индексного буфера.
|
Там потому так и заложено, чтоб можно было способы описания поверхностей добавлять. От той же кривой (кривых) на опорных точках можно разными способами оттолкнуться чтоб поверхность задать. Высчитывать-то по любому - попадания определять например.
ТехноМаг : |
А, кстати. Текстурная развертка на это дело планируется? Или только цветом материал Будешь показывать?
|
Угу. Цвета пока за глаза и за уши. Максимум, потом уже, - однородная поверхность, а пока не зачем.
_________________ Мы на многое не отваживаемся не потому что оно трудно; оно трудно именно потому, что мы на него не отваживаемся.
Сенека Старший
Последний раз редактировалось: Olorin (01:08 28-01-2015), всего редактировалось 1 раз |
|
|
БулерМэн 420 EGP
Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006 |
|
Olorin : |
Там потому так и заложено, чтоб можно было способы описания поверхностей добавлять.
|
А собственно, что мешает всю логику относительно генерации поверхности корабля выделить в отдельный блок кода и не трогать его пока не будет реализован весь остальной "простой кубизм" который уже всем приелся?
Мне кажется, что фичу игры лучше добавлять к более менее реализованному проекту, чем отсекать лишнее от монолита и добиваться работоспособности всего в целом. На не структурированный подход, без выделения блоков - уйдет больше времени и сил. Сейчас у тебя кусок кода отвечает за генерацию поверхности по кривой, а потом у тебя появится какая-либо необходимость что-то изменить и полезут баги - так как данная фича это не отдельное нечто, не какой-либо "модификатор", а часть общего кода, который жестко вшит.
добавлено спустя 5 минут:
--
Кстати, а не проще ли игроку в этом случае - лепить поверхность кораблика не по кривой, а брать этот треугольник и перетаскиванием прицеплять на другой треугольник?
Просто с точки зрения сложности кода - такой подход с перетаскиванием и заготовками - намного проще, имхо.
добавлено спустя 6 минут:
--
Если представить, что у тебя уже есть код, который генерирует поверхность из треугольников то появляется резонный вопрос - а как сделать так, чтобы количество треугольников было одинаковым по всей поверхности модельки?
Допускаю, что у тебя все треугольники подгоняются в размерах, "тянутся" и создают гладкую поверхность. Но от того, что они разные каким образом ты будешь автоматом подгонять текстуру?
А вот если взять готовые куски, то на готовый кусок можно сделать стандартную текстуру или несколько. Да, возможно будет угловато, но тут уж надо для себя решить, что ты хочешь:
а) проще реализовать программисту + долго рисовать игроку
б) сложнее реализовать программисту + быстро рисовать игроку.
добавлено спустя 3 минуты:
Эта задачка на уровне "придумай свой 3d-редактор" в котором можно изгибать поверхности потягивая за "узлы". Сложновато, имхо.
Последний раз редактировалось: БулерМэн (21:22 29-01-2015), всего редактировалось 4 раз(а) |
|
|
|
|
|
Канал Игры Мечты: «Техническая помощь в реализации самописных игр» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Пилот! Ставь перед собой большие цели - по ним тяжелее промазать. (учит chiba)
|
» Техническая помощь в реализации самописных игр | страница 2 |
|