如何旋转对象,使其顶点不会与任何其他旋转重叠?具有预定义的旋转次数。
思想: 它可以通过放松来实现。 (想法来自Greg Turk的论文:使用反应扩散在任意曲面上生成纹理)
步骤:
问题: 这不是点的简单放松问题。在这里,由于十二面体约束,我不能只是翻译。需要旋转矩阵/四元数。
答案 0 :(得分:0)
蛮力的可能解决方案
摘要:
随机旋转,直到达到所需的平均距离
说明:
旋转每个十二面体,直到它的顶点不与其他十二面体的任何顶点重叠。
然后计算平均距离并检查最佳(最小)到目前为止。保存所有顶点位置和旋转四元数,将基本十二面体转换为旋转的十二面体。
float minThreshold <- user defined
int iterationThreshold <- user defined
float minAveDistance = Infinity;
while (minAveDistance > minThreshold || maxIteration > iterationThreshold) {
Foreach (dodecahedron) { // except the first one, that can stay as is
// rotate randomly until there are no overlapping positions with the other dodecahedrons
while (checkOverlappingWithOtherDodecahedrons(dodecahedron)) {
rotateRandomly(dodecahedron);
}
}
float aveDistance = CalculateAverageDistanceBetweenAllPointsOfDodecahedrons();
if (aveDistance < minAveDistance) {
minAveDistance = aveDistance;
SaveAllPositions(); // e.g.: to a file
SaveAllRotationQuaternionsFromStartOrientation(); // e.g.: to a file
}
}