Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

172 wiersze
5.6 KiB

  1. -- 3D平訂伽邿佴艤
  2. local Move3DTool = class("Move3DTool", require("MoveTool"))
  3. function Move3DTool:ctor()
  4. self.super.ctor(self);
  5. self.factor = 1.0;
  6. self.startScreenPos = nil;
  7. end
  8. function Move3DTool:clear()
  9. self.super.clear(self);
  10. self.startScreenPos = nil;
  11. end
  12. function Move3DTool:MouseDown(button , x , y)
  13. if self.super.MouseDown(self, button, x, y) then
  14. self.startScreenPos = cc.p(x, y);
  15. end
  16. end
  17. function Move3DTool:convertScreenToWorldPos(mouseX, mouseY, planeNormal, planeDistance)
  18. local floorPlane = cc.Plane:new(planeNormal , planeDistance);
  19. -- 輪蹋远mainlayer謩藔蕨位變
  20. local screenSize = cc.Director:getInstance():getWinSizeInPixels();
  21. local ray = app.mainCamera:pickRay(mouseX / screenSize.width , mouseY / screenSize.height);
  22. local dist = ray:intersectsPlane(floorPlane);
  23. if dist >= 0 then
  24. return ray:getPoint(dist);
  25. else
  26. return ray:getPoint(0);
  27. end
  28. end
  29. function Move3DTool:moveTo(screenX, screenY)
  30. -- 斩
  31. local targetOffset;
  32. --[[local offset = cc.pSub(endPos , self.startPos);
  33. if app.cs.getModifierKeys() == Keys.Control then
  34. -- 只艤覙Y住蕪袀訂织
  35. targetOffset = cc.vec3(0, offset.y * self.factor, 0);
  36. else
  37. -- 諝XZ平摩蕪摩平訂
  38. targetOffset = cc.vec3(offset.x * self.factor, 0, offset.y * self.factor);
  39. end--]]
  40. -- Shift酄樧喲阶?
  41. if app.cs.getModifierKeys() == Keys.Shift then
  42. for i , v in pairs(self.originPoies) do
  43. local originWorld = v.rotate;
  44. i:setEulerRotation(originWorld.x , originWorld.y + (screenX - self.startScreenPos.x) , originWorld.z);
  45. end
  46. else
  47. for i , v in pairs(self.originPoies) do
  48. local originWorld = i:getParent():convertToWorldSpace(v.pos);
  49. if app.cs.getModifierKeys() == Keys.Control then
  50. -- 只艤覙Y住蕪袀訂织
  51. -- 顺要写袀时謩藔蕨位變
  52. local normal
  53. if originWorld.z > 0 then
  54. normal = cc.vec3(0,0,-1)
  55. else
  56. normal = cc.vec3(0,0,1)
  57. end
  58. local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.z);
  59. -- 毡前顺要謩藔蕨位變
  60. local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.z);
  61. targetOffset = cc.vec3(0, curWorldPos.y - downWorldPos.y, 0);
  62. else
  63. local normal
  64. if originWorld.y > 0 then
  65. normal = cc.vec3(0,-1,0)
  66. else
  67. normal = cc.vec3(0,1,0)
  68. end
  69. -- 顺要写袀时謩藔蕨位變
  70. local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.y);
  71. -- 毡前顺要謩藔蕨位變
  72. local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.y);
  73. targetOffset = cc.vec3(curWorldPos.x - downWorldPos.x, 0, curWorldPos.z - downWorldPos.z);
  74. end
  75. local newWorld = cc.vec3Add(originWorld , targetOffset);
  76. local newLocal = i:getParent():convertToNodeSpace(newWorld);
  77. i:setTranslation(newLocal);
  78. end
  79. end
  80. end
  81. function Move3DTool:commandMoveTo(screenX, screenY)
  82. local endPos = cc.p(screenX, screenY);
  83. -- 骚诨没詯注屎偏訂詹一穴要訂织
  84. if cc.pEqual(endPos, self.startPos) then
  85. return;
  86. end
  87. -- 通诮募庐4訂织
  88. local commands = {};
  89. -- 斩
  90. local targetOffset;
  91. if app.cs.getModifierKeys() == Keys.Shift then
  92. for i , v in pairs(self.originPoies) do
  93. local originWorld = v.rotate;
  94. local newLocal = cc.vec3(originWorld.x , originWorld.y + (screenX - self.startScreenPos.x) , originWorld.z);
  95. i:setEulerRotation(v.rotate);
  96. table.insert(commands, Commands:rotateNode(i, newLocal));
  97. end
  98. else
  99. for i , v in pairs(self.originPoies) do
  100. local originWorld = i:getParent():convertToWorldSpace(v.pos);
  101. if app.cs.getModifierKeys() == Keys.Control then
  102. -- 只艤覙Y住蕪袀訂织
  103. -- 顺要写袀时謩藔蕨位變
  104. local normal
  105. if originWorld.z > 0 then
  106. normal = cc.vec3(0,0,-1)
  107. else
  108. normal = cc.vec3(0,0,1)
  109. end
  110. local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.z);
  111. -- 毡前顺要謩藔蕨位變
  112. local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.z);
  113. targetOffset = cc.vec3(0, curWorldPos.y - downWorldPos.y, 0);
  114. else
  115. local normal
  116. if originWorld.y > 0 then
  117. normal = cc.vec3(0,-1,0)
  118. else
  119. normal = cc.vec3(0,1,0)
  120. end
  121. -- 顺要写袀时謩藔蕨位變
  122. local downWorldPos = self:convertScreenToWorldPos(self.startScreenPos.x, self.startScreenPos.y, normal, originWorld.y);
  123. -- 毡前顺要謩藔蕨位變
  124. local curWorldPos = self:convertScreenToWorldPos(screenX, screenY, normal, originWorld.y);
  125. targetOffset = cc.vec3(curWorldPos.x - downWorldPos.x, 0, curWorldPos.z - downWorldPos.z);
  126. end
  127. local newWorld = cc.vec3Add(originWorld , targetOffset);
  128. local newLocal = i:getParent():convertToNodeSpace(newWorld);
  129. i:setTranslation(v.pos);
  130. table.insert(commands, Commands:moveNode(i, newLocal));
  131. end
  132. end
  133. app.undoRedoManager:doCommand(Commands:batchCommand(commands));
  134. end
  135. function Move3DTool:commandMoveBy(offset)
  136. -- 骚诨没詯注屎偏訂詹一穴要訂织
  137. if cc.pEqual(offset, {x = 0, y = 0}) then
  138. return;
  139. end
  140. -- 斩
  141. local targetOffset = cc.vec3(offset.x, 0, offset.y);
  142. -- 通诮募庐4訂织
  143. local commands = {};
  144. for i , v in pairs(app.editor.SelectedNodes) do
  145. local originWorld = v:getParent():convertToWorldSpace(v:getPosition());
  146. local newWorld = cc.vec3Add(originWorld , targetOffset);
  147. local newLocal = v:getParent():convertToNodeSpace(newWorld);
  148. table.insert(commands, Commands:moveNode(v, newLocal));
  149. end
  150. app.undoRedoManager:doCommand(Commands:batchCommand(commands));
  151. end
  152. return Move3DTool;