Fix angle calculation

master
Jeremy Hu 2019-08-19 21:09:21 +09:30
parent 74bbae57e4
commit e725bdba8c
7 changed files with 24 additions and 17 deletions

View File

@ -41,6 +41,7 @@ MousePicker::~MousePicker()
bool MousePicker::calculateMouseModelPosition(QVector3D &mouseModelPosition) bool MousePicker::calculateMouseModelPosition(QVector3D &mouseModelPosition)
{ {
bool foundPosition = false; bool foundPosition = false;
auto ray = (m_mouseRayNear - m_mouseRayFar).normalized();
float minDistance2 = std::numeric_limits<float>::max(); float minDistance2 = std::numeric_limits<float>::max();
for (size_t i = 0; i < m_outcome.triangles.size(); ++i) { for (size_t i = 0; i < m_outcome.triangles.size(); ++i) {
const auto &triangleIndices = m_outcome.triangles[i]; const auto &triangleIndices = m_outcome.triangles[i];
@ -50,6 +51,8 @@ bool MousePicker::calculateMouseModelPosition(QVector3D &mouseModelPosition)
m_outcome.vertices[triangleIndices[2]], m_outcome.vertices[triangleIndices[2]],
}; };
const auto &triangleNormal = m_outcome.triangleNormals[i]; const auto &triangleNormal = m_outcome.triangleNormals[i];
if (QVector3D::dotProduct(triangleNormal, ray) <= 0)
continue;
QVector3D intersection; QVector3D intersection;
if (intersectSegmentAndTriangle(m_mouseRayNear, m_mouseRayFar, if (intersectSegmentAndTriangle(m_mouseRayNear, m_mouseRayFar,
triangle, triangle,
@ -63,7 +66,7 @@ bool MousePicker::calculateMouseModelPosition(QVector3D &mouseModelPosition)
} }
} }
} }
return true; return foundPosition;
} }
void MousePicker::pick() void MousePicker::pick()
@ -80,21 +83,24 @@ void MousePicker::pick()
for (const auto &node: map.paintNodes) { for (const auto &node: map.paintNodes) {
if (!m_mousePickMaskNodeIds.empty() && m_mousePickMaskNodeIds.find(node.originNodeId) == m_mousePickMaskNodeIds.end()) if (!m_mousePickMaskNodeIds.empty() && m_mousePickMaskNodeIds.find(node.originNodeId) == m_mousePickMaskNodeIds.end())
continue; continue;
float sumOfDistance = 0;
size_t intersectedNum = 0; size_t intersectedNum = 0;
QVector3D sumOfDirection; QVector3D sumOfDirection;
QVector3D referenceDirection = (m_targetPosition - node.origin).normalized(); QVector3D referenceDirection = (m_targetPosition - node.origin).normalized();
float sumOfRadius = 0;
for (const auto &vertexPosition: node.vertices) { for (const auto &vertexPosition: node.vertices) {
if (QVector3D::dotProduct(referenceDirection, (vertexPosition - node.origin).normalized()) > 0 && // >0.866 = <30 degrees
auto direction = (vertexPosition - node.origin).normalized();
if (QVector3D::dotProduct(referenceDirection, direction) > 0.866 &&
(vertexPosition - m_targetPosition).lengthSquared() <= distance2) { (vertexPosition - m_targetPosition).lengthSquared() <= distance2) {
sumOfDistance += vertexPosition.distanceToPoint(m_targetPosition); float distance = vertexPosition.distanceToPoint(m_targetPosition);
sumOfDirection += (vertexPosition - node.origin).normalized(); float radius = (m_radius - distance) / node.radius;
sumOfRadius += radius;
sumOfDirection += direction * radius;
++intersectedNum; ++intersectedNum;
} }
} }
if (intersectedNum > 0) { if (intersectedNum > 0) {
float averageDistance = sumOfDistance / intersectedNum; float paintRadius = sumOfRadius / intersectedNum;
float paintRadius = (m_radius - averageDistance) / node.radius;
QVector3D paintDirection = sumOfDirection.normalized(); QVector3D paintDirection = sumOfDirection.normalized();
float degrees = angleInRangle360BetweenTwoVectors(node.baseNormal, paintDirection, node.direction); float degrees = angleInRangle360BetweenTwoVectors(node.baseNormal, paintDirection, node.direction);
float offset = (float)node.order / map.paintNodes.size(); float offset = (float)node.order / map.paintNodes.size();
@ -133,10 +139,10 @@ void MousePicker::paintToImage(const QUuid &partId, float x, float y, float radi
{ {
QRadialGradient gradient(destX, destY, destRadius / 2); QRadialGradient gradient(destX, destY, destRadius / 2);
if (inverted) { if (inverted) {
gradient.setColorAt(0, QColor(0, 0, 0, 2)); gradient.setColorAt(0, QColor(0, 0, 0, 3));
gradient.setColorAt(1, Qt::transparent); gradient.setColorAt(1, Qt::transparent);
} else { } else {
gradient.setColorAt(0, QColor(255, 255, 255, 2)); gradient.setColorAt(0, QColor(255, 255, 255, 3));
gradient.setColorAt(1, Qt::transparent); gradient.setColorAt(1, Qt::transparent);
} }
QBrush brush(gradient); QBrush brush(gradient);

View File

@ -43,7 +43,7 @@ float angleInRangle360BetweenTwoVectors(QVector3D a, QVector3D b, QVector3D plan
float degrees = acos(QVector3D::dotProduct(a, b)) * 180.0 / M_PI; float degrees = acos(QVector3D::dotProduct(a, b)) * 180.0 / M_PI;
QVector3D direct = QVector3D::crossProduct(a, b); QVector3D direct = QVector3D::crossProduct(a, b);
if (QVector3D::dotProduct(direct, planeNormal) < 0) if (QVector3D::dotProduct(direct, planeNormal) < 0)
return 180 + degrees; return 360 - degrees;
return degrees; return degrees;
} }

View File

@ -412,6 +412,7 @@ bool Builder::build()
unifyBaseNormals(); unifyBaseNormals();
localAverageBaseNormals(); localAverageBaseNormals();
unifyBaseNormals();
for (const auto &nodeIndex: m_sortedNodeIndices) { for (const auto &nodeIndex: m_sortedNodeIndices) {
if (!generateCutsForNode(nodeIndex)) if (!generateCutsForNode(nodeIndex))

View File

@ -38,7 +38,7 @@ float nodemesh::degreeBetweenIn360(const QVector3D &a, const QVector3D &b, const
auto angle = radianToDegree(angleBetween(a, b)); auto angle = radianToDegree(angleBetween(a, b));
auto c = QVector3D::crossProduct(a, b); auto c = QVector3D::crossProduct(a, b);
if (QVector3D::dotProduct(c, direct) < 0) { if (QVector3D::dotProduct(c, direct) < 0) {
angle += 180; angle = 360 - angle;
} }
return angle; return angle;
} }

View File

@ -31,9 +31,9 @@ bool ChartPacker::tryPack(float textureSize)
std::vector<maxRectsSize> rects; std::vector<maxRectsSize> rects;
int width = textureSize * m_floatToIntFactor; int width = textureSize * m_floatToIntFactor;
int height = width; int height = width;
if (m_tryNum > 50) { //if (m_tryNum > 50) {
//qDebug() << "Try the " << m_tryNum << "nth times pack with factor:" << m_textureSizeFactor << " size:" << width << "x" << height; // qDebug() << "Try the " << m_tryNum << "nth times pack with factor:" << m_textureSizeFactor << " size:" << width << "x" << height;
} //}
float paddingSize = m_paddingSize * width; float paddingSize = m_paddingSize * width;
float paddingSize2 = paddingSize + paddingSize; float paddingSize2 = paddingSize + paddingSize;
for (const auto &chartSize: m_chartSizes) { for (const auto &chartSize: m_chartSizes) {

View File

@ -21,11 +21,11 @@ private:
std::vector<std::pair<float, float>> m_chartSizes; std::vector<std::pair<float, float>> m_chartSizes;
std::vector<std::tuple<float, float, float, float, bool>> m_result; std::vector<std::tuple<float, float, float, float, bool>> m_result;
float m_initialAreaGuessFactor = 1.1; float m_initialAreaGuessFactor = 1.1;
float m_textureSizeGrowFactor = 0.01; float m_textureSizeGrowFactor = 0.05;
float m_floatToIntFactor = 10000; float m_floatToIntFactor = 10000;
size_t m_tryNum = 0; size_t m_tryNum = 0;
float m_textureSizeFactor = 1.0; float m_textureSizeFactor = 1.0;
float m_paddingSize = 0.001; float m_paddingSize = 0.002;
size_t m_maxTryNum = 100; size_t m_maxTryNum = 100;
}; };

View File

@ -18,7 +18,7 @@ static float angle360(const Eigen::Vector3d &a, const Eigen::Vector3d &b, const
auto angle = atan2((a.cross(b)).norm(), a.dot(b)) * 180.0 / 3.1415926; auto angle = atan2((a.cross(b)).norm(), a.dot(b)) * 180.0 / 3.1415926;
auto c = a.cross(b); auto c = a.cross(b);
if (c.dot(direct) < 0) { if (c.dot(direct) < 0) {
angle += 180; angle = 360 - angle;
} }
return angle; return angle;
} }