Цитата:
Сообщение от wizardpnz
да,чтобы координаты считались как если бы мы их мерили руками на экране о начала координат и без разворотов
я понимаю что базис где то сам применяет свою матрицу но в других прогах такого нет
там просто координаты начала объекта XYZ и ШВГ
и строим в направлении X+ Y+ Z+
тут надо копать
http://grazit.ru/geometricheskie-pre...j-grafike.html
|
Сделал скрипт для настройки положения панели в точку по минимальным координатам. Использовать его просто: запускаете, указываете панель, и радуетесь (?) результату. Тестировал я его долго (после каждого исправления скрипта, приходилось проверять все варианты поворотов снова), заманался, поэтому довел до состояния "кажется, должно работать" и отдаю его вам. Если обнаружите ошибку, пришлите пример с панелью, которая неправильно преобразовывается, и я поправлю код.
Пока не забыл: В некоторых случаях для приведения позиции объекта к минимальным координатам используется сдвиг контура панели, что может плохо отразиться на элементах панели (например, на пазах).
Код скрипта
Код:
function NegateVector(v) {
return {
x: -v.x,
y: -v.y,
z: -v.z
}
}
/**
*
* @param {Object3} obj
*/
function CorrectObject(obj) {
StartEditing(obj);
var minG = obj.ToObject(obj.GabMin);
var curPos = obj.ToObject(obj.Owner.ToGlobal(obj.Position));
var rot = obj.RotMatrix;
var negate = {
x: false,
y: false,
z: false
}
var x = {
x: rot[0],
y: rot[1],
z: rot[2],
}
var y = {
x: rot[4],
y: rot[5],
z: rot[6],
}
var z = {
x: rot[8],
y: rot[9],
z: rot[10],
}
const eps = 0.001;
if (minG.x > curPos.x + eps) {
negate.x = true;
}
if (minG.y > curPos.y + eps) {
negate.y = true;
}
if (minG.z > curPos.z + eps) {
negate.z = true;
}
if (negate.x) {
if (negate.y) {
if (negate.z) {
z = NegateVector(z);
y = NegateVector(y);
var shift = obj.NToGlobal({
x: obj.GSize.x,
y: obj.GSize.y,
z: obj.GSize.z
});
obj.Contour.Move(-obj.GSize.x, 0);
obj.TranslateGCS(shift);
} else {
y = NegateVector(y);
var shift = obj.NToGlobal({
x: obj.GSize.x,
y: obj.GSize.y,
z: 0
});
obj.TranslateGCS(shift);
}
} else if (negate.z) {
z = NegateVector(z);
var shift = obj.NToGlobal({
x: obj.GSize.x,
y: 0,
z: obj.GSize.z
});
obj.TranslateGCS(shift);
} else {
obj.Contour.Move(-obj.GSize.x, 0);
var shift = obj.NToGlobal({
x: obj.GSize.x,
y: 0,
z: 0
});
obj.TranslateGCS(shift);
}
}
else if (negate.y) {
if (negate.z) {
z = NegateVector(z);
y = NegateVector(y);
var shift = obj.NToGlobal({
x: 0,
y: -obj.GSize.y,
z: obj.GSize.z
});
obj.TranslateGCS(shift);
}
else {
obj.Contour.Move(0, -obj.GSize.y);
var shift = obj.NToGlobal({
x: 0,
y: obj.GSize.y,
z: 0
});
obj.TranslateGCS(shift);
}
} else if (negate.z) {
z = NegateVector(z);
var shift = obj.NToGlobal({
x: 0,
y: 0,
z: obj.GSize.z
});
obj.Contour.Move(-obj.GSize.x, 0);
obj.TranslateGCS(shift);
}
// Теперь ориентируем объект по осям Y и Z
obj.Orient(z, y);
}
var obj = GetPanel('panel 1');
if (obj) {
CorrectObject(obj);
}
[свернуть]
З.Ы. И, как всегда с опозданием, приходит еще одна умная мысль, которая может загубить на корню весь труд выше:
wizardpnz, а не проще ли взять минимальную точку объекта за позицию и вычислить размер панели, например так:
Код:
var pos = obj.GabMin;
var size = {
x: obj.GabMax.x - obj.GabMin.x,
y: obj.GabMax.y - obj.GabMin.y,
z: obj.GabMax.z - obj.GabMin.z,
}
//или
size = obj.NToGlobal(obj.GSize);
З.З.Ы. Обдумал: этот вариант подходит только для ортогональных панелей.